(немного повозившись позже, я думаю, что я в целом согласен с Аленом. Я получаю значительную скорость от простого прерывания после определенного числа итераций, но независимо от того, используется ли поток, time.time напрямую или частично подход выборки, в значительной степени все они в конечном итоге приводят к ухудшению времени l oop. time.time()
, вероятно, уже достаточно высоко оптимизированы, поэтому все дополнительные логические значения и тому подобное, чтобы избежать его слишком частого использования, вероятно, не улучшат ничего).
Не знаю, является ли это более эффективным, но вы можете попробовать поток и общий изменяемый объект для управления l oop. Вот тест за 0,5 секунды.
import time
from threading import Thread
def myfunc(mutable_):
time.sleep(0.5)
mutable_.value = False
print("done")
class Mutable:
value = True
mutable_ = Mutable()
t = Thread(target=myfunc, args=(mutable_,))
start = time.time()
t.start()
while mutable_.value:
print(time.time() - start)
Мне неизвестно, является ли атрибут l oop доступа к mutable_.value
, который не требует непосредственного участия потока, настолько дешевле, чем опрос самого потока.
Теперь, в моем тесте, была небольшая разница, когда поток еще не обновил значение, поэтому l oop побежал немного по сравнению с использованием собственного локального проверка времени Может быть возможно установить время вашего потока на 299,9 секунды, приблизиться и более аккуратно финишировать sh.
Вот v2, использующий нить, спящий, чтобы получить большую часть пути (то есть 0,49), и a, обычно короткое замыкание time.time()
проверка для завершения.
def myfunc(mutable_, looptime):
time.sleep(looptime)
mutable_.value = False
t = Thread(target=myfunc, args=(mutable_,.49))
t.start()
start = time.time()
while mutable_.value or (time.time() - start <= .5):
print(time.time() - start)