Ответ 1
Эквивалент в питоне будет:
>>> import time
>>> tic = time.clock()
>>> toc = time.clock()
>>> toc - tic
Если вы пытаетесь найти наиболее эффективный метод, вам, вероятно, стоит взглянуть на timeit
.
Я новичок в Python и смущен датой/временем. Я хочу вычислить время, необходимое для выполнения вычисления.
В java я бы написал:
long timeBefore = System.currentTimeMillis();
doStuff();
long timeAfter = System.currentTimeMillis();
elapsed time = timeAfter - timeBefore;
Я уверен, что это еще проще в Python. Может ли кто-нибудь помочь?
Эквивалент в питоне будет:
>>> import time
>>> tic = time.clock()
>>> toc = time.clock()
>>> toc - tic
Если вы пытаетесь найти наиболее эффективный метод, вам, вероятно, стоит взглянуть на timeit
.
Основываясь на нескольких предыдущих ответах (спасибо: 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
включает более сложные вызовы для автоматической синхронизации небольших фрагментов кода, включая усреднение времени выполнения по определенному набору повторений.
Использовать тайм-аут. http://docs.python.org/library/timeit.html
Вы можете реализовать две функции 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
Для Python 3.3 и более поздних очень time.process_time()
:
import time
t = time.process_time()
#do some stuff
elapsed_time = time.process_time() - t
python -m timeit -h
Если все, что вам нужно, это время между двумя точками в коде (и кажется, что вы хотите), я написал функции 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
Для получения дополнительной информации о том, как определить время обработки, и сравнение нескольких методов (некоторые из них уже упоминаются в ответах на этот пост) - в частности, разница между:
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)
Я также получил требование вычислить время обработки некоторых строк кода. Поэтому я попробовал утвержденный ответ и получил это предупреждение.
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 и далее.