我使用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()函数的范围?
答案 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附带的其他分析工具之一。