我有一个Python模块,其中包含一个while循环,该循环应该运行固定的时间。为此,我向time.time()的输出添加了一个常量,并运行直到time.time()大于该变量。这没有任何问题,但是在Cython中,同样的事情对我不起作用。现在我越来越不准时机了。
仅举一个最小的例子来说明这一点:
import time
cdef float wait_time = 3
def slow():
cdef float end_time = time.time() + wait_time
while time.time() < end_time:
pass
print("Done")
%timeit -r1 -n1 slow()
Done
44.2 µs ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)
%timeit -r1 -n1 slow()
Done
35.5 µs ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)
%timeit -r1 -n1 slow()
Done
35.5 µs ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)
%timeit -r1 -n1 slow()
Done
19.5 µs ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)
%timeit -r1 -n1 slow()
Done
35.5 µs ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)
%timeit -r1 -n1 slow()
Done
20.6 µs ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)
%timeit -r1 -n1 slow()
Done
20 µs ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)
%timeit -r1 -n1 slow()
Done
56 µs ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)
%timeit -r1 -n1 slow()
Done
1min 3s ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)
%timeit -r1 -n1 slow()
Done
32.9 µs ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)
%timeit -r1 -n1 slow()
Done
1min 5s ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)
趋向于遵循的一般行为是,基本上没有等待,除了在运行该功能之前暂停了一段时间之后,在这种情况下,等待过多。
答案 0 :(得分:5)
Python的float
是C的double
。 C的float
usually has仅24个有效位(其中一个是隐含的),因此精度为128秒(自2004年起)。当您的加法从四舍五入变为四舍五入时,它从过去的一分钟变为将来的一分钟。