为什么将我的模块分成多个文件会使它变慢?

Mil*_*use 5 python performance numpy cpython python-3.5

我制作了一个 Python 模块 ( swood),直到最近,它还是一个包含许多类的大文件。将相关类重构为单独的文件后,一切仍然有效,尽管慢了大约 50%。我认为,如果有的话,它会变得更快一点,因为 Python 可以更有效地缓存每个文件的字节码,从而缩短启动时间。

我正在使用 CPython 运行此代码(尚未使用 PyPy 及其同类产品进行测试)。我已经line_profiler在旧版本和重构版本上运行,并且在重构前后每行花费的处理时间百分比看起来大致相同。

以下是关于我的程序的一些可能与它有关的事情:

  • 它使很多像这样的小类Note并且实例化这些类可能很昂贵,尽管在重构之前这不是问题。
  • 在制作这些类时,它从一个单独的文件中获取它们,它import位于开头。
  • numpy耗时最长的部分(缩放混合音频)中发生了很多基于数组的操作
  • 如果在 7.5 秒内使用超过 3 次,我有一个缓存,可以将缩放的音符存储在其中。(代码

是什么导致我的代码除了将其分成多个文件之外什么都不做而变得更慢?

Mil*_*use 4

经过更多的基准测试后,这是我怀疑的事情之一:必须从另一个模块访问函数/类意味着对 Python 解释器的另一次查找,并且在一些紧密的循环中会出现轻微的减慢。Python wiki 也有相关内容:

避免点...

假设您不能使用映射或列表理解?您可能会被 for 循环困住。for 循环示例还有另一个低效率问题。newlist.append 和 word.upper 都是每次循环时都会重新计算的函数引用。原来的循环可以替换为:

upper = str.upper
newlist = []
append = newlist.append
for word in oldlist:
    append(upper(word))
Run Code Online (Sandbox Code Playgroud)