我的功能需要消极时间才能完成。世界上发生了什么?

时间:2010-07-20 17:55:14

标签: python time timing

我提出这个问题主要是出于好奇。我写了一些代码,这些代码正在做一些非常耗时的工作。因此,在执行我的主力函数之前,我将其包含在对time.clock()的几次调用中。它看起来像这样:

t1 = time.clock()
print this_function_takes_forever(how_long_parameter = 20)
t2 = time.clock()
print t2 - t1

这很好用。我的函数正确返回,t2 - t1给了我972.29的结果,或大约16分钟。

但是,当我将代码更改为

t1 = time.clock()
print this_function_takes_forever(how_long_parameter = 80)
t2 = time.clock()
print t2 - t1

我的功能仍然正常,但t2 - t1的结果是:

None
-1741

我很好奇实施细节导致了什么。 None和负数都让我感到困惑。它与签名类型有关吗?这如何解释None

3 个答案:

答案 0 :(得分:17)

Python docs说:

  

在Unix上,将当前处理器时间返回为以秒为单位的浮点数。精确度,实际上是“处理器时间”含义的定义,取决于同名C函数的精确度

引用的C函数的manpage然后解释了问题:

  

请注意,时间可以环绕。在CLOCKS_PER_SEC等于1000000的32位系统上,此函数将执行此操作          大约每72分钟返回相同的值。

答案 1 :(得分:2)

快速猜测......看起来像是溢出。默认数据类型可能是签名数据类型(将有符号整数的第一位置为1会给出负数)。

尝试将减法的结果放在变量(double)中,然后打印它。

如果它仍然打印出来,你可以尝试将它从double转换为string,然后在字符串上使用'print'函数。

答案 2 :(得分:1)

None有一个非常简单的答案,你的函数不会返回一个值。实际上我收集的是正常情况下的情况,但是当how_long_parameter = 80时却没有。因为你的函数似乎提前返回(可能是因为执行到了Python中隐式返回None的函数的末尾),否则时间可能是因为在这种情况下你的功能几乎没有时间完成?因此,请查找函数中的错误并进行更正。

关于为什么得到负时间的实际答案取决于您使用的操作系统,因为clock()在不同平台上的实现方式不同。在Windows上它使用QueryPerformanceCounter(),在* nix上它使用C函数clock()。