Datetime.datetime.now возвращает кэшированные значения при частом вызове? - PullRequest
1 голос
/ 20 марта 2020

Я использую Python 3.7.6, с I Python 7.12.0

Код для репликации:

import datetime
mylist = []
for _ in range(10000):
    mylist.append(datetime.datetime.now())

Глядя на mylist, я получаю куски около 2000 идентичных дат, которые находятся на расстоянии около 1 мс. Поскольку объекты datetime.datetime имеют разрешение 1 мкс, теоретически я должен получить куски из 2 элементов, которые находятся на расстоянии 1 мкс друг от друга.

Что здесь происходит? Возвращается ли значение для datetime.datetime.now () в 1 мс? Если да, то это делается на стороне Python или на стороне C?

1 Ответ

2 голосов
/ 20 марта 2020

Что здесь происходит? Возвращается ли значение для datetime.datetime.now () в 1 мс? Если это так, выполняется ли это на стороне Python или на стороне C?

Кэширование не используется. Как задокументировано datetime.now относится к time.time, который не является высокоточным тактовым сигналом и (также как документировано) может даже не иметь разрешения в доли секунды:

Обратите внимание, что хотя время всегда возвращается как число с плавающей запятой, не все системы предоставляют время с большей точностью, чем 1 секунда.

Следовательно, разрешение datetime.now будет зависеть от системы, в которой он запущен, и конфигурации этой системы.

Предполагается, что вы работаете в windows, PEP 564 задокументировал разрешение time.time() как 894us или 0,9 мс, достаточно близкое к 1 мс (для Windows 8).

Вы можете использовать альтернативные часы для документов, если вам нужно более высокое разрешение:

  • time.time_ns() имеет разрешение ~ 300 мкс на Windows
  • perf_counter() имеет разрешение 100 нс, однако не возвращает отметку времени , поэтому требуется больше работы, так как вам нужно сохранить эталонную метку времени и perf_counter, а затем использовать эти , чтобы сместить следующие счетчики перфораций и получить фактические метки времени.
...