python -> время выполнения цикла while

у меня есть цикл, который работает до нескольких часов за раз. как я мог заставить его сказать мне, как долго это было с заданным интервалом?

просто общий... вопрос

РЕДАКТИРОВАТЬ: это цикл while, который запускает перестановки, поэтому могу ли я печатать время каждые 10 секунд?


person tekknolagi    schedule 18.01.2011    source источник


Ответы (3)


Вместо проверки времени в каждом цикле вы можете использовать объект Timer.

import time
from threading import Timer

def timeout_handler(timeout=10):
    print time.time()
    timer = Timer(timeout, timeout_handler)
    timer.start()

timeout_handler()
while True:
    print "loop"
    time.sleep(1)
person kefeizhou    schedule 18.01.2011
comment
+1 Гораздо лучше, чем мой ответ, мне нравится, что в питоне есть такие батареи. - person fmark; 18.01.2011

Как уже отмечалось, это немного неприятный хак, так как он включает проверку времени на каждой итерации. Чтобы это работало, вам нужно иметь задачи, которые выполняются в течение небольшого процента времени ожидания - если ваш цикл повторяется только каждую минуту, он не будет распечатываться каждые десять секунд. Если вы хотите, чтобы вас прерывали, вы можете рассмотреть многопоточность или, что предпочтительнее, если вы используете linux/mac/unix, сигналы. Какая у вас платформа?

import time

timeout = 10
first_time = time.time()
last_time = first_time
while(True):
    pass #do something here
    new_time = time.time()
    if  new_time - last_time > timeout:
        last_time = new_time
        print "Its been %f seconds" % (new_time - first_time)

Выход:

Its been 10.016000 seconds
Its been 20.031000 seconds
Its been 30.047000 seconds
person fmark    schedule 18.01.2011
comment
о боже, я люблю тебя, но что делает pass? поставить что-то вместо него? - person tekknolagi; 18.01.2011
comment
pass — это пустая операция, это просто заполнитель и вообще ничего не делает (на самом деле). Просто замените его своим кодом. - person fmark; 18.01.2011
comment
Хм, я не знал об объекте Timer, я бы рекомендовал вам переключиться на его использование в ответе ниже. - person fmark; 18.01.2011

Есть очень хитрый способ сделать это с помощью time.asctime(). Вы сохраняете asctime перед входом в цикл while и где-то в самом цикле. Вычислите разницу во времени между сохраненным временем и текущим временем, и если эта разница составляет 10 секунд, обновите сохраненное время до текущего времени и распечатайте, что оно выполнялось.

Тем не менее, это очень хакерский способ сделать это, поскольку он требует некоторой запутанной и скучной математики.

Если ваша цель — проверить время выполнения определенного алгоритма, вам лучше использовать модуль timeit.

Надеюсь это поможет

person inspectorG4dget    schedule 18.01.2011