Python time.clock () против точности time.time ()? - PullRequest
410 голосов
/ 17 сентября 2008

Что лучше использовать для синхронизации в Python? time.clock () или time.time ()? Какой из них обеспечивает большую точность?

например:

start = time.clock()
... do something
elapsed = (time.clock() - start)

против

start = time.time()
... do something
elapsed = (time.time() - start)

Ответы [ 16 ]

146 голосов
/ 17 сентября 2008

Начиная с 3.3, time.clock () устарело , и предлагается использовать time.process_time () или time.perf_counter () вместо.

Ранее в 2.7, в соответствии с модулем времени, документами :

time.clock ()

В Unix вернуть текущее время процессора в виде числа с плавающей запятой выражается в секундах. Точность, а на самом деле само определение значение «процессорное время», зависит от функции C с тем же именем, но в любом случае, эта функция используется для бенчмаркинг Python или алгоритмы синхронизации.

В Windows эта функция возвращает часы настенных часов, прошедшие с момента первый вызов этой функции, как число с плавающей запятой, на основе Win32 функция QueryPerformanceCounter (). Разрешение обычно лучше, чем одна микросекунда.

Кроме того, есть модуль timeit для сравнительного анализа фрагментов кода.

45 голосов
/ 17 сентября 2008

Краткий ответ: в большинстве случаев time.clock() будет лучше. Однако, если вы синхронизируете какое-то оборудование (например, какой-то алгоритм, который вы вставили в графический процессор), то time.clock() избавится от этого времени, и time.time() - это единственное оставшееся решение.

Примечание: какой бы метод ни использовался, время будет зависеть от факторов, которые вы не можете контролировать (когда произойдет переключение процесса, как часто ...), это хуже с time.time(), но существует и с time.clock(), поэтому Вы никогда не должны запускать только один тест синхронизации, но всегда выполнять серию тестов и смотреть на среднее / дисперсию времени.

24 голосов
/ 17 сентября 2008

Другие ответили повторно: time.time() против time.clock().

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

19 голосов
/ 11 февраля 2010

Стоит помнить одну вещь: Изменение системного времени влияет на time.time(), но не time.clock().

Мне нужно было контролировать выполнение некоторых автоматических тестов. Если один шаг тестового примера занимал больше заданного времени, этот TC был прерван, чтобы перейти к следующему.

Но иногда необходимо было выполнить шаг для изменения системного времени (чтобы проверить модуль планировщика тестируемого приложения), поэтому после установки системного времени через несколько часов время TC истекло, и тестовый случай был прерван. Мне пришлось переключиться с time.time() на time.clock(), чтобы справиться с этим правильно.

18 голосов
/ 17 сентября 2008

clock() -> число с плавающей точкой

Возвращает процессорное время или реальное время с начала процесса или после первый звонок на clock(). Это имеет столько же точности, как система записи.

time() -> число с плавающей запятой

Возвращает текущее время в секундах с начала эпохи. Могут присутствовать доли секунды, если их обеспечивают системные часы.

Обычно time() является более точным, поскольку операционные системы не хранят время выполнения процесса с точностью, в которой они хранят системное время (то есть фактическое время)

17 голосов
/ 17 сентября 2008

Зависит от того, что вы заботитесь. Если вы имеете в виду WALL TIME (как, например, время на часах на вашей стене), time.clock () НЕТ точности, поскольку она может управлять временем процессора.

13 голосов
/ 17 января 2014

Для моего practice. time() имеет лучшую точность, чем clock() в Linux. clock() имеет точность менее 10 мс. В то время как time() дает префект точность. Мой тест на CentOS 6.4 , python 2.6

using time():

1 requests, response time: 14.1749382019 ms
2 requests, response time: 8.01301002502 ms
3 requests, response time: 8.01491737366 ms
4 requests, response time: 8.41021537781 ms
5 requests, response time: 8.38804244995 ms

using clock():

1 requests, response time: 10.0 ms
2 requests, response time: 0.0 ms 
3 requests, response time: 0.0 ms
4 requests, response time: 10.0 ms
5 requests, response time: 0.0 ms 
6 requests, response time: 0.0 ms
7 requests, response time: 0.0 ms 
8 requests, response time: 0.0 ms
6 голосов
/ 17 сентября 2008

Разница очень зависит от платформы.

clock () очень отличается в Windows, например, от Linux.

Для примеров, которые вы описываете, вы, вероятно, захотите использовать модуль "timeit".

3 голосов
/ 17 сентября 2008

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

Если вы пишете код, предназначенный только для Windows, любой из них будет работать (хотя вы будете использовать два по-разному - для time.clock ()) вычитание не требуется. Если это будет выполняться в системе Unix или вы хотите, чтобы код, который гарантированно был переносимым, вы захотите использовать time.time ().

2 голосов
/ 05 апреля 2018

Как уже отмечали другие, time.clock() устарела в пользу time.perf_counter() или time.process_time(), но Python 3.7 вводит синхронизацию с наносекундным разрешением с time.perf_counter_ns(), time.process_time_ns() и time.time_ns() вместе с 3 другими функциями.

Эти 6 новых функций с разрешением наносекунды подробно описаны в PEP 564 :

time.clock_gettime_ns(clock_id)

time.clock_settime_ns(clock_id, time:int)

time.monotonic_ns()

time.perf_counter_ns()

time.process_time_ns()

time.time_ns()

Эти функции аналогичны версии без суффикса _ns, но вернуть число наносекунд в виде Python int.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...