为什么 pypy 的 clock() 如此不精确?

Why is pypy's clock() so imprecise?

我尝试对我的一些代码进行计时,并注意到 pypy 的一些非常奇怪的结果。看这个例子:

from time import clock
from random import randint

times = []
for _ in range(10):
  start = clock()
  sum(i * i for i in range(randint(1000000, 2000000))) # waste time
  end = clock()
  times.append(int((end - start) * 1000000))

for t in times:
  print(t, "µs")

运行 python3, 果然有一堆随机结果:

506246 µs
461735 µs
403287 µs
472049 µs
651156 µs
609496 µs
467181 µs
633187 µs
562603 µs
744360 µs

运行 pypy,好像什么都只精确到三分之一秒:

43332 µs
36667 µs
30000 µs
23332 µs
19999 µs
23334 µs
26665 µs
20000 µs
36667 µs
26666 µs

这是为什么?

来自Python documentation

The precision, and in fact the very definition of the meaning of “processor time”, depends on that of the C function of the same name.

不同的实现精度会有所不同。在这种情况下,pypy 似乎使用了一个周期为 1/30 秒的计时器,因此精度永远不会比这更好。

Mark的回答理论上是正确的,但确实是个bug。请在 PyPy 的问题跟踪器上打开一个错误,准确指定您正在使用的平台和 PyPy 版本(我似乎在 Linux 上获得了正确的精度,John 在 Windows 上获得了正确的精度)。