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


428

Що краще використовувати для синхронізації в Python? time.clock () або time.time ()? Який із них забезпечує більшу точність?

наприклад:

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

vs.

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

32
Зауважте, що, як і в Python 3.3, використання time.clock()застаріло , і рекомендується використовувати perf_counter()або process_time()замість цього.
Коді Пірсолл


Дивіться цей коментар про те , як все ядра , використовувані в процесі підсумовуються в time.clockі time.process_time, але дочірні процеси не є. Також дивіться це обговорення точності (звичайно, залежно від системи).
макс

Відповіді:


161

Станом на 3.3 час time.clock () застарілий , і пропонується використовувати замість time.process_time () або time.perf_counter () .

Раніше в 2.7, згідно з документами модуля часу :

time.clock ()

У Unix поверніть поточний час процесора у вигляді числа з плаваючою комою, вираженого в секундах. Точність, а насправді саме визначення значення "процесорного часу", залежить від функції однойменної функції C, але, у будь-якому випадку, це функція, яка використовується для бенчмаркінгу Python або алгоритмів синхронізації.

У Windows ця функція повертає годинникові секунди, що минули з моменту першого виклику цієї функції, як номер з плаваючою точкою на основі функції Win32 QueryPerformanceCounter (). Роздільна здатність, як правило, краще, ніж одна мікросекунда.

Крім того, є модуль timeit для фрагментів коду бенчмаркінгу.


4
"Це функція, яка використовується для тестування Python або алгоритмів синхронізації". <br> Документи Python не здаються точними на основі наведених тут відповідей. time.clock () - це не завжди те, що вам потрібно для порівняльного аналізу. особливо з існуванням модуля timeit
Корі Голдберг,

1
@Corey Goldberg: значить, ви подали помилку в документації ? (Вони мали на увазі "використовувати clock (), а не час () :, але так, це неохайно)
smci


3
Як можна прочитати тут, здається, поведінка time.clock()депедентів на платформі, і time.process_time()це не так. Це причина, чому time.clock()його застаріли.
Джим Ахо

46

Коротка відповідь: більша частина часу time.clock()буде кращою. Однак якщо ви призначаєте деяке обладнання (наприклад, якийсь алгоритм, який ви вводите в GPU), time.clock()ви позбудетеся цього часу і time.time()це єдине рішення, що залишилося.

Примітка. Незалежно від використовуваного методу, терміни залежатимуть від факторів, якими ви не можете керувати (коли процес буде перемикатися, як часто, ...), це гірше, time.time()але існує також і з time.clock(), тому ніколи не слід запускати лише один тест часу, але завжди виконуйте серію тесту і переглядайте середню / відмінність часу.


також при запиті мережевого ресурсу асинхронним способом (процес буде заблокований для очікування) час мережі буде позбавлений.
дазони

25

Інші відповіли: Re: time.time()VS. time.clock().

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


16
+1: timeit.default_timerпризначається time.time()або time.clock()залежно від ОС. На Python 3.3+ default_timerє time.perf_counter()на всіх платформах.
jfs

19

Майте на увазі одне: зміна системного часу впливає, time.time()але ні time.clock().

Мені потрібно було контролювати деякі автоматичні виконання тестів. Якщо один крок тестового випадку зайняв більше часу, цей ТС перервався, щоб продовжувати роботу з наступним.

Але іноді потрібен крок для зміни системного часу (для перевірки модуля планувальника тестованої програми), тому після встановлення системного часу на кілька годин у майбутньому час очікування TC закінчився, а тестовий випадок був скасований. Мені довелося перейти, time.time()щоб time.clock()правильно це впоратися.


1
Я це шукав. Дякую :) Це допоможе мені, навіть якщо користувач змінить свій час з ОС.
Aashiq Hussain

Як я можу порівняти цей час із тим, що зберігається користувачем у форматі година: хвилина?
Aashiq Hussain

19

clock() -> номер з плаваючою комою

Поверніть час або реальний час процесора з початку процесу або з першого дзвінка в clock(). Це має стільки точності, скільки система записує.

time() -> номер з плаваючою комою

Повернути поточний час у секундах з епохи. Части секунди можуть бути присутніми, якщо системний годинник їх надає.

Зазвичай time()є більш точним, оскільки операційні системи не зберігають час роботи процесу з точністю, вони зберігають системний час (тобто фактичний час)


17

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


1
точно, я просто використовував time.clock()на серверах Linux, і цифри, які я отримав, напевно, не були секундами
Роман Плашил,

15

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

тому я припускаю час () на вино ??
Tcll

6

Різниця дуже залежить від платформи.

clock () дуже відрізняється в Windows, ніж, наприклад, у Linux.

Для подібних прикладів, які ви описуєте, ви, мабуть, бажаєте замість цього модуля "timeit".


3
Ви могли б розширити, яким чином clockце "very different"?
n611x007

5

Як уже відзначено , 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, але повертають кількість наносекунд як int Python.

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


3

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

Якщо ви пишете код, призначений лише для Windows, або він буде працювати (хоча ви використовуватимете їх по-різному - віднімання не потрібне для time.clock ()). Якщо це буде працювати в системі Unix або ви хочете, щоб код, який гарантовано є портативним, вам потрібно використовувати time.time ().


2

Коротка відповідь: використовуйте time.clock () для синхронізації в Python.

У * nix системах clock () повертає час процесора у вигляді числа з плаваючою комою, вираженого в секундах. У Windows він повертає секунди, що минули з моменту першого дзвінка до цієї функції, як номер з плаваючою комою.

time () повертає секунди з епохи, в UTC, у вигляді числа з плаваючою комою. Немає гарантії, що ви отримаєте кращу точність, що за 1 секунду (навіть якщо час () повертає число з плаваючою комою). Також зауважте, що якщо системний годинник було повернуто між двома дзвінками до цієї функції, другий виклик функції поверне нижнє значення.


2

Наскільки я розумію, time.clock () має стільки точності, скільки ваша система дозволить.


2

Я використовую цей код для порівняння двох методів. Моя ОС - це Windows 8, процесорне ядро ​​i5, оперативна пам’ять 4 Гб

import time

def t_time():
    start=time.time()
    time.sleep(0.1)
    return (time.time()-start)


def t_clock():
    start=time.clock()
    time.sleep(0.1)
    return (time.clock()-start)




counter_time=0
counter_clock=0

for i in range(1,100):
    counter_time += t_time()

    for i in range(1,100):
        counter_clock += t_clock()

print "time() =",counter_time/100
print "clock() =",counter_clock/100

вихід:

час () = 0,093799996376

годинник () = 0,093572257367


1

Правильна відповідь: вони обоє однакової довжини дробу.

Але що швидше, якщо subjectє time?

Невеликий тестовий випадок :

import timeit
import time

clock_list = []
time_list = []

test1 = """
def test(v=time.clock()):
    s = time.clock() - v
"""

test2 = """
def test(v=time.time()):
    s = time.time() - v
"""
def test_it(Range) :
    for i in range(Range) :
        clk = timeit.timeit(test1, number=10000)
        clock_list.append(clk)
        tml = timeit.timeit(test2, number=10000)
        time_list.append(tml)

test_it(100)

print "Clock Min: %f Max: %f Average: %f" %(min(clock_list), max(clock_list), sum(clock_list)/float(len(clock_list)))
print "Time  Min: %f Max: %f Average: %f" %(min(time_list), max(time_list), sum(time_list)/float(len(time_list)))

Я не працюю в швейцарських лабораторіях, але я протестував ..

Виходячи з цього питання: time.clock()краще, ніжtime.time()

Редагувати: time.clock()це внутрішній лічильник, тому він не може використовуватись зовні, має обмеження max 32BIT FLOAT, не може продовжувати рахувати, якщо не зберігати перше / останнє значення. Неможливо об'єднати ще один лічильник ...


0

time.clock()було видалено в Python 3.8, оскільки він мав залежність від платформи :

  • У Unix поверніть поточний час процесора у вигляді числа з плаваючою комою, вираженого в секундах.
  • У Windows ця функція повертає настінні годинники, що минули з моменту першого виклику цієї функції, як номер з плаваючою комою

    print(time.clock()); time.sleep(10); print(time.clock())
    # Linux  :  0.0382  0.0384   # see Processor Time
    # Windows: 26.1224 36.1566   # see Wall-Clock Time

То яку функцію вибрати замість цього?

  • Час процесора . Це час, який цей конкретний процес витрачає активно на виконання процесора. Сон, очікування веб-запиту або час, коли виконуються лише інші процеси, не сприятимуть цьому.

    • Використовуйте time.process_time()
  • Час настінного годинника : це стосується того, скільки часу минуло "на годиннику, що висить на стіні", тобто поза реальним часом.

    • Використовуйте time.perf_counter()

      • time.time() також вимірює час настінного годинника, але його можна скинути, щоб ви могли піти назад у часі
      • time.monotonic() не може бути скинутий (монотонне = йде лише вперед), але має меншу точність, ніж time.perf_counter()

-1

Порівняння результатів тесту між Ubuntu Linux та Windows 7.

На Ubuntu

>>> start = time.time(); time.sleep(0.5); (time.time() - start)
0.5005500316619873

У Windows 7

>>> start = time.time(); time.sleep(0.5); (time.time() - start)
0.5

будь ласка, прочитайте інші відповіді, щоб зрозуміти різницю між Windows та unix / linux.
Корі Голдберг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.