1

在我的单核 1.4 GHz 计算机上,我运行了以下 2 个 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”。这是不寻常的行为还是预期的行为?

任何帮助是极大的赞赏。

4

2 回答 2

1

我对两个片段同时有效(在 0.4% 以内)。Python 将 os 模块作为正常导入的一部分导入

>>> import sys
>>> "os" in sys.modules
True
>>> 

因此,带有“import os”的第二段代码甚至没有进入磁盘。它所做的只是对 sys.modules 进行检查。

您可以检查 import builtins是否给出相同的反应,但我真的无法解释您所看到的。您可以在启动 Python 时启用“-v”选项,以获得更多关于它正在做什么的诊断,并比较结果。它们应该是相同的。

于 2010-09-18T19:22:35.510 回答
1

我能想到的唯一可能的原因可以解释这种行为,这并不重要:L1 缓存行未命中,我指的是数据缓存(Python VM 字节码不是处理器的可执行代码)。您的count函数代码存储为单独的代码对象,其起始地址或速度不应受到设置代码的影响。这是非常不正常的行为。

你的处理器是什么牌子的?你的 Python 版本?你的操作系统版本?测试结果是否可重复?

于 2010-10-17T19:32:48.470 回答