为什么相同的python代码具有不同的时钟时间?

时间:2018-08-25 14:00:21

标签: python cpu-usage clock

我正在使用以下python代码对服务器进行基准测试:

import time
initial_clock = time.clock()
res = 0
for i in range(1, 10000000):
    res += i * i
print (time.clock() - initial_clock)

当我多次运行它时,我得到的执行时间从2.163377秒到2.970836秒。 我知道同一代码可能会由于CPU负载的变化而具有不同的执行时间,但是正如time.clock文档中所述,它仅考虑当前进程时钟,因此即使使用time.clock(),它也应具有相同的执行时间。使用time.time()会有所不同。不应该吗?

反正我还能为一段python代码获得准确的clock计数吗?

编辑:我使用time.process_time()并得到相同的结果。

1 个答案:

答案 0 :(得分:5)

时间码的第一条规则:使用timeit module。这样可以自动为您的操作系统选择最佳的计时器,最大程度地减少其他影响,并进行多次计时以提供最准确的时间估算。

接下来,time.clock() 不是特定于进程的。是的,这是CPU上的时钟时间,但不是当前进程使用CPU所花费的时间。计划在CPU上运行的其他进程将增加所花费的时间。您想改用time.process_time()

但是,所有代码都可能受到潜在的缓存和特定于Python的周期性过程(例如garbage collector)的影响。您无法期望获得可重复的time.clock()time.process_time()值,因为该时钟无法说明Python进程本身中的此类后台工作。您可以在计时代码时禁用垃圾收集器进程(timeit为您执行此操作),但这对内部缓存(特定于实现且大多数未记录)的内部缓存无济于事。

timeit使用time.perf_counter()来包含花费在I / O和其他进程上的时间,这些时间可能会被测试代码启动。您可以通过将time.process_time()用作命令行脚本时使用-p开关,或在调用API函数时传递timeit来告诉它使用timer=time.process_time来代替。