time.time () не работает для запуска цикла while в течение заданного времени в Cython - PullRequest
5 голосов
/ 06 мая 2019

У меня был модуль 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 Ответ

5 голосов
/ 06 мая 2019

Python's float - это C's double.C float обычно имеет только 24 значащих и битовых (один из них неявный), что дает ему точность 128 секунд (с 2004 года).Когда ваше добавление изменяется от округления до округления вверх, оно перемещается с одной минуты в прошлом до значения одной минуты в будущем.

...