3

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

4

3 回答 3

17

Python 文档说:

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

引用的 C 函数的联机帮助页然后解释了该问题:

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

于 2010-07-20T18:05:04.280 回答
2

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

尝试将减法的结果放入变量(双精度)中,然后打印。

如果仍然这样打印,您可以尝试将其从双精度转换为字符串,然后在字符串上使用“打印”功能。

于 2010-07-20T17:58:23.527 回答
1

None 有一个非常简单的答案,您的函数不返回值。实际上,我认为这是在正常情况下,但不是当 how_long_parameter = 80 时。因为您的函数似乎提前返回(可能是因为执行到达函数的末尾,在 Python 中隐式返回 None),负时间可能是因为在这种情况下您的功能几乎不需要时间来完成?所以在你的函数中寻找错误并纠正它。

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

于 2010-07-20T18:04:38.020 回答