Подтвердить что ты не робот

Как определить время обработки в Python?

Я новичок в Python и смущен датой/временем. Я хочу вычислить время, необходимое для выполнения вычисления.

В java я бы написал:

long timeBefore = System.currentTimeMillis();
doStuff();
long timeAfter = System.currentTimeMillis();
elapsed time = timeAfter - timeBefore;

Я уверен, что это еще проще в Python. Может ли кто-нибудь помочь?

4b9b3361

Ответ 1

Эквивалент в питоне будет:

>>> import time
>>> tic = time.clock()
>>> toc = time.clock()
>>> toc - tic

Если вы пытаетесь найти наиболее эффективный метод, вам, вероятно, стоит взглянуть на timeit.

Ответ 2

Основываясь на нескольких предыдущих ответах (спасибо: SilentGhost, nosklo, Ramkumar), простой переносной таймер использовал бы timeit default_timer():

>>> import timeit
>>> tic=timeit.default_timer()
>>> # Do Stuff
>>> toc=timeit.default_timer()
>>> toc - tic #elapsed time in seconds

Это вернет истекшее настенное время (реальное), а не время процессора. И как описано в timeit документации, выбирается наиболее точный доступный реальный таймер в зависимости от платформы.

Кроме того, начиная с Python 3.3, эта же функциональность доступна с помощью счетчика производительности time.perf_counter. Под 3.3+ timeit.default_timer() ссылается на этот новый счетчик.

Для более точных/сложных вычислений производительности timeit включает более сложные вызовы для автоматической синхронизации небольших фрагментов кода, включая усреднение времени выполнения по определенному набору повторений.

Ответ 4

Вы можете реализовать две функции tic() и tac(), где tic() фиксирует время, которое он вызывается, а tac() печатает разницу во времени с момента tic(). Вот короткая реализация:

import time

_start_time = time.time()

def tic():
    global _start_time 
    _start_time = time.time()

def tac():
    t_sec = round(time.time() - _start_time)
    (t_min, t_sec) = divmod(t_sec,60)
    (t_hour,t_min) = divmod(t_min,60) 
    print('Time passed: {}hour:{}min:{}sec'.format(t_hour,t_min,t_sec))

Теперь в вашем коде вы можете использовать его как:

tic()
do_some_stuff()
tac()

и это будет, например, выводить:

Time passed: 0hour:7min:26sec

Смотрите также:

Ответ 5

Для Python 3.3 и более поздних очень time.process_time():

import time

t = time.process_time()
#do some stuff
elapsed_time = time.process_time() - t

Ответ 6

python -m timeit -h

Ответ 7

Если все, что вам нужно, это время между двумя точками в коде (и кажется, что вы хотите), я написал функции tic() toc() реализации Matlab. Основной вариант использования:

tic()

''' some code that runs for an interesting amount of time '''

toc()

# OUTPUT:
# Elapsed time is: 32.42123 seconds

Супер, невероятно простой в использовании, что-то вроде кода "забей и забудь". Это доступно на Github Gist https://gist.github.com/tyleha/5174230

Ответ 8

Для получения дополнительной информации о том, как определить время обработки, и сравнение нескольких методов (некоторые из них уже упоминаются в ответах на этот пост) - в частности, разница между:

start = time.time()

по сравнению с устаревшим (с 3.3, time.clock() устарел)

start = time.clock()

см. эту статью в статье Stackoverflow здесь:

Python - time.clock() vs. time.time() - точность?

Если ничего другого, это будет работать хорошо:

start = time.time()

... do something

elapsed = (time.time() - start)

Ответ 9

Я также получил требование вычислить время обработки некоторых строк кода. Поэтому я попробовал утвержденный ответ и получил это предупреждение.

DeprecationWarning: time.clock has been deprecated in Python 3.3 and will be removed from Python 3.8: use time.perf_counter or time.process_time instead

Таким образом, Python удалит time.clock() из Python 3.8. Вы можете узнать больше об этом из выпуска # 13270. Это предупреждение предлагает две функции вместо time.clock(). В документации также подробно упоминайте об этом предупреждении в разделе time.clock().

Устаревшее с версии 3.3, будет удалено в версии 3.8. Поведение этой функции зависит от платформы: используйте вместо этого perf_counter() или process_time(), в зависимости от ваших требований, чтобы иметь четко определенное поведение.

Давайте подробно рассмотрим обе функции.


Возвращает значение (в долях секунды) счетчика производительности, то есть часов с наибольшим доступным разрешением для измерения короткой длительности. Он включает время, прошедшее во время сна, и является общесистемным. Контрольная точка возвращаемого значения не определена, поэтому допустима только разница между результатами последовательных вызовов.

Новое в версии 3.3.

Поэтому, если вы хотите использовать его как nanoseconds, вы можете использовать time.perf_counter_ns(), и если ваш код состоит из time.sleep(secs), он также будет учитываться. Пример: -

import time


def func(x):
    time.sleep(5)
    return x * x


lst = [1, 2, 3]
tic = time.perf_counter()
print([func(x) for x in lst])
toc = time.perf_counter()
print(toc - tic)

# [1, 4, 9]
# 15.0041916 --> output including 5 seconds sleep time

Возвращает значение (в долях секунды) суммы системного и пользовательского процессорного времени текущего процесса. Не включает время, прошедшее во время сна. Это процесс по определению. Контрольная точка возвращаемого значения не определена, поэтому допустима только разница между результатами последовательных вызовов.

Новое в версии 3.3.

Поэтому, если вы хотите использовать его как nanoseconds, вы можете использовать time.process_time_ns(), и если ваш код состоит из time.sleep(secs), он не будет учитываться. Пример: -

import time


def func(x):
    time.sleep(5)
    return x * x


lst = [1, 2, 3]
tic = time.process_time()
print([func(x) for x in lst])
toc = time.process_time()
print(toc - tic)

# [1, 4, 9]
# 0.0 --> output excluding 5 seconds sleep time

Обратите внимание, что time.perf_counter_ns() и time.process_time_ns() предлагают Python 3.7 и далее.