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

Zac*_*son 5 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")
Run Code Online (Sandbox Code Playgroud)
%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)
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*ing 5

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