Python中time.clock()的范围

时间:2015-10-27 11:11:14

标签: python-2.7

我使用Python 2.7.6来测量算法的运行时间:

starting_time = time.clock()      
# run algorithm
finishing_time = time.clock()
running_time = (finishing_time - starting_time)

我使用不同的输入大小运行算法。该算法为O(n平方),我得到以下结果:

Input Size Running Time

  1K        0.079382

  10K       8.310275

  100K      838.066953

  1000K    -2040.323576

当输入大小为1000K时,running_time应该是大约83800.相反,我得到否定结果。是因为time.clock()函数的范围?

1 个答案:

答案 0 :(得分:1)

是的,这是因为底层系统调用的限制。您获得的结果将取决于您的平台。

在Windows上,系统调用始终返回带符号的64位整数(除以计数器频率)。所以它不应该在任何合理的时间范围内进行。

在Linux上,基础整数要么是32位有符号要么是64位有符号,具体取决于您的平台是32位还是64位系统。它还进一步除以计数器的频率,因此32位整数可以在几个小时后明确地换行。

在Linux上你应该使用较新的clock_gettime()系统调用而不是clock(),它不应该有这个环绕问题。如果您使用的是Python 3.3或更新版本,它就像:

一样简单
time.clock_gettime(time.CLOCK_PROCESS_CPUTIME_ID)

如果你有旧版本的Python,你可以安装一个像posix_timers这样的C API包给你clock_gettime()。查看:https://pypi.python.org/pypi/posix_timers/

或者,您可以使用ctypes自行访问它。有一个堆栈溢出问题,显示如何使用单调时钟执行此操作:How do I get monotonic time durations in python?

您唯一的区别就是定义CLOCK_PROCESS_CPUTIME_ID = 2并使用它代替CLOCK_MONOTONIC_RAW

然而,最好的答案可能是jonrsharpe给出的答案,即使用timeit或Python附带的其他分析工具之一。