缓存python字节码提供了多少启动速度改进?

时间:2018-03-12 22:43:07

标签: python performance bytecode

CPython会自动将所有.py个文件编译并缓存到同一目录或.pyc目录中的__pycache__个文件中,具体取决于版本。使用这些缓存文件提供了多少速度提升?

询问python代码的执行速度 - 这个问题已被多次回答:"执行速度没有差异,.pyc个文件只是为了提高启动速度。"

我在问启动速度有多大提升。

1 个答案:

答案 0 :(得分:0)

这取决于相关模块的复杂程度,导入的数量等等。

在本地测试中,我将collections.py复制到我的本地目录,然后使用:

进行测试
time python -B -E -S -c 'import collections; print(collections)'

试图在没有缓存字节码的情况下单独确定collections模块的粗略端到端成本,然后在没有-B的情况下确定相同的成本(因此它将创建并使用字节码缓存)。差异大约是5 ms(-B为36 ms,第二次和后续运行时没有-B为31 ms。

对于更细粒度的测试,显式编译而不使用ipython %timeit魔法调用任何其他导入机制得到:

>>> with open('collections.py') as f: data = f.read()
...

>>> %timeit -r5 compile(data, 'collections.py', 'exec', 0, 1)
100 loops, best of 5: 2.9 ms per loop

这省略了其他一些import机械工作,只是反复重新编译,它运行~3 ms,这似乎是合理的。如果您要导入一百个源模块(并非完全不合理,计算所有级联导入的少数显式导入触发器),每次保存1-5 ms可以为短程序运行带来有意义的差异。