datetime.datetime.now return 是否在频繁调用时缓存值?
Does datetime.datetime.now return cached values when called frequently?
我正在使用 Python 3.7.6,IPython 7.12.0
要复制的代码:
import datetime
mylist = []
for _ in range(10000):
mylist.append(datetime.datetime.now())
查看 mylist
,我得到了大约 2000 个相同的日期时间块,它们之间的时间间隔大约为 1 毫秒。因为 datetime.datetime 对象的分辨率为 1µs,理论上我应该得到 2 个项目的块,它们相隔 1µs。
这里发生了什么? datetime.datetime.now() 的 return 值是否缓存了 1 毫秒?如果是这样,这是在 Python 侧还是 C 侧完成的?
What is happening here? Is the return value for datetime.datetime.now() cached for 1ms? If so, is this done on the Python side or the C side?
不涉及缓存。 As documented datetime.now
遵循 time.time
这不是高精度时钟并且(也如文档所述)甚至可能没有亚秒分辨率:
Note that even though the time is always returned as a floating point number, not all systems provide time with a better precision than 1 second.
因此 datetime.now
的分辨率将取决于它 运行 所在的系统和该系统的配置。
假设您在 windows 上 运行,PEP 564 将 time.time()
的分辨率记录为 894us,或 0.9ms,足够接近 1ms(对于 Windows8).
如果您需要更高分辨率,您可以使用它记录的替代时钟:
time.time_ns()
在 Windows 上的分辨率约为 300us
perf_counter()
的分辨率为 100ns,但 它没有 return 时间戳 ,因此涉及的工作更多,因为您需要保存一个参考时间戳和 perf_counter 然后使用 这些 以抵消以下性能计数器并获得实际时间戳。
我正在使用 Python 3.7.6,IPython 7.12.0
要复制的代码:
import datetime
mylist = []
for _ in range(10000):
mylist.append(datetime.datetime.now())
查看 mylist
,我得到了大约 2000 个相同的日期时间块,它们之间的时间间隔大约为 1 毫秒。因为 datetime.datetime 对象的分辨率为 1µs,理论上我应该得到 2 个项目的块,它们相隔 1µs。
这里发生了什么? datetime.datetime.now() 的 return 值是否缓存了 1 毫秒?如果是这样,这是在 Python 侧还是 C 侧完成的?
What is happening here? Is the return value for datetime.datetime.now() cached for 1ms? If so, is this done on the Python side or the C side?
不涉及缓存。 As documented datetime.now
遵循 time.time
这不是高精度时钟并且(也如文档所述)甚至可能没有亚秒分辨率:
Note that even though the time is always returned as a floating point number, not all systems provide time with a better precision than 1 second.
因此 datetime.now
的分辨率将取决于它 运行 所在的系统和该系统的配置。
假设您在 windows 上 运行,PEP 564 将 time.time()
的分辨率记录为 894us,或 0.9ms,足够接近 1ms(对于 Windows8).
如果您需要更高分辨率,您可以使用它记录的替代时钟:
time.time_ns()
在 Windows 上的分辨率约为 300us
perf_counter()
的分辨率为 100ns,但 它没有 return 时间戳 ,因此涉及的工作更多,因为您需要保存一个参考时间戳和 perf_counter 然后使用 这些 以抵消以下性能计数器并获得实际时间戳。