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

时间:2016-05-13 06:15:20

标签: python performance numpy python-3.5 cpython

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

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

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

  • 它会产生许多像Note这样的小类,并且实例化它们可能会很昂贵,尽管这在重构之前不是问题。
  • 在创建这些类时,它会从一个单独的文件中获取它们import s。
  • 在部分中发生了大量基于numpy的数组操作,需要花费最长时间(scalingmixing音频)
  • 如果在7.5秒内使用了三次以上,我有一个存储缩放音符的缓存。 (code

是什么原因导致我的代码在无所事事之后变慢,只是将其分成多个文件?

2 个答案:

答案 0 :(得分:3)

经过一些更多的基准测试之后,这是我怀疑的事情之一:必须从另一个模块访问函数/类意味着另一个Python解释器的查找,并且在一些紧密的循环中添加了轻微的减速。 The Python wiki has something about this, too:

  

避免点......

     

假设您不能使用地图或列表理解?你可能会陷入困境   与for循环。 for循环示例具有另一个低效率。都   newlist.append和word.upper是函数引用   每次循环重新评估。原始循环可以   替换为:

upper = str.upper
newlist = []
append = newlist.append
for word in oldlist:
    append(upper(word))

答案 1 :(得分:2)

您的重构似乎不仅仅是将类移动到不同的文件中。例如,UncachedWavFile丢失了__setitem__方法。并且,在其他地方魔术数字已经改变。我建议你先去其他地方慢慢看。

我不希望看到将代码库重构为单独文件的速度有任何差异,预计启动时间可能会有少量(甚至微小)减少。我建议在拆分之前进行分支,然后只将代码分成单独的文件,分析代码的性能,然后慢慢添加自拆分后添加的代码,每次分析以查看代码的速度变慢。