我有一个 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)
这往往遵循的一般行为是基本上没有等待,除非在运行该函数之前暂停一段时间,在这种情况下会出现过多的等待。
最佳答案
Python 的 float
是 C 的 double
。 C 的 float
usually has只有 24 个有效位(其中一个是隐式的),使其精度为 128 秒(自 2004 年起)。当您的加法从向下舍入变为向上舍入时,它会从过去一分钟移动到 future 一分钟的值。
关于python - time.time() 无法在 Cython 中运行 while 循环预定时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55997211/