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

Why does separating my module into multiple files make it slower?

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

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

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

是什么导致我的代码在将代码分成多个文件后什么都不做之后变慢?

您的重构似乎不仅仅是将 类 移动到不同的文件中。例如,UncachedWavFile 丢失了一个 __setitem__ 方法。并且,在其他地方,幻数已被更改。我建议你先到别处寻找减速的方法。

我不希望看到将您的代码库重构为单独的文件在速度上有任何差异,预计启动时间可能会稍微(甚至很小)减少。我建议在拆分之前进行分支,实际上只是将代码分离到单独的文件中,分析代码的性能,然后慢慢添加自拆分以来添加的代码,每次都进行分析以查看是什么减慢了代码速度。

经过更多的基准测试后,这是我怀疑的事情之一:必须从另一个模块访问 functions/classes 意味着对 Python 解释器的另一次查找,并且在某些情况下会出现轻微的减速紧密的循环。 The Python wiki has something about this, too:

Avoiding dots...

Suppose you can't use map or a list comprehension? You may be stuck with the for loop. The for loop example has another inefficiency. Both newlist.append and word.upper are function references that are reevaluated each time through the loop. The original loop can be replaced with:

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