time.time()无法在Cython中运行while循环达预定时间

时间:2019-05-05 23:15:25

标签: python cython

我有一个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)

趋向于遵循的一般行为是,基本上没有等待,除了在运行该功能之前暂停了一段时间之后,在这种情况下,等待过多。

1 个答案:

答案 0 :(得分:5)

Python的float是C的double。 C的float usually has仅24个有效位(其中一个是隐含的),因此精度为128秒(自2004年起)。当您的加法从四舍五入变为四舍五入时,它从过去的一分钟变为将来的一分钟。