我提出这个问题主要是出于好奇。我写了一些代码,这些代码正在做一些非常耗时的工作。因此,在执行我的主力函数之前,我将其包含在对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
?
答案 0 :(得分:17)
在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()。