CPython会自动将所有.py
个文件编译并缓存到同一目录或.pyc
目录中的__pycache__
个文件中,具体取决于版本。使用这些缓存文件提供了多少速度提升?
我不询问python代码的执行速度 - 这个问题已被多次回答:"执行速度没有差异,.pyc
个文件只是为了提高启动速度。"
我在问启动速度有多大提升。
答案 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可以为短程序运行带来有意义的差异。