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

标签 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)

这往往遵循的一般行为是基本上没有等待,除非在运行该函数之前暂停一段时间,在这种情况下会出现过多的等待。

最佳答案

Python 的 float 是 C 的 double。 C 的 float usually has只有 24 个有效位(其中一个是隐式的),使其精度为 128 秒(自 2004 年起)。当您的加法从向下舍入变为向上舍入时,它会从过去一分钟移动到 future 一分钟的值。

关于python - time.time() 无法在 Cython 中运行 while 循环预定时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55997211/

相关文章:

python - 如何用Numba创建dict类型的类属性?

python - 优化我的 Cython/Numpy 代码?目前只有 30% 的性能提升

python - Cython 模块可以与 python 包一起导入

python - 导入错误: No module named SOAPpy

python - 在 Python 密码学库中提取模数 n、私有(private)指数和公共(public)指数

python - 使用 python 请求发布 XML

python - Cython 和 numpy 速度

python - Cython setup.py 找不到已安装的 Visual C++ 构建工具

python - Cython 的意外输出和返回值

python - 将 Python 模块导入 Jupyter notebook