为什么“python -mtimeit”在代码包含模块导入时显示更少的时间?
在我的单核1.4 GHz的电脑上,我运行了以下两个timeit代码:
suzan:~$ python -mtimeit "
def count(n):
while n > 0:
n -= 1
count(10000000)
"
10 loops, best of 3: 1.73 sec per loop
suzan:~$
suzan:~$ python -mtimeit "
import os
def count(n):
while n > 0:
n -= 1
count(10000000)
"
10 loops, best of 3: 1.18 sec per loop
suzan:~$
第二个timeit命令的运行时间比第一个要短,尽管它多了一行代码“import os”。这是不寻常的情况还是正常现象呢?
非常感谢任何帮助。
2 个回答
1
我能想到的唯一可能解释这种行为的原因,其实不太重要:就是L1缓存行缺失。我说的是数据缓存(Python的虚拟机字节码并不是你处理器可以直接执行的代码)。你的count
函数的代码是存储在一个单独的代码对象里的,它的起始地址或者运行速度不应该受到设置代码的影响。这种行为真的是很不寻常。
你的处理器是什么品牌?你的Python版本是什么?你的操作系统版本呢?测试结果能重复吗?
1
我发现这两段代码的运行时间几乎是一样的,误差在0.4%以内。Python在正常导入时会引入os模块。
>>> import sys
>>> "os" in sys.modules
True
>>>
所以第二段代码中有“import os”,实际上并没有去读取硬盘上的内容。它只是检查了一下sys.modules这个东西。
你可以试试导入builtins,看看结果是否一样,但我真的不知道你看到的情况怎么解释。你可以在启动Python时加上“-v”选项,这样可以得到更多关于它在做什么的信息,然后对比一下结果。它们应该是一样的。