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 564time.time() 的分辨率记录为 894us,或 0.9ms,足够接近 1ms(对于 Windows8).

如果您需要更高分辨率,您可以使用它记录的替代时钟:

  • time.time_ns() 在 Windows
  • 上的分辨率约为 300us
  • perf_counter() 的分辨率为 100ns,但 它没有 return 时间戳 ,因此涉及的工作更多,因为您需要保存一个参考时间戳和 perf_counter 然后使用 这些 以抵消以下性能计数器并获得实际时间戳。