datetime.fromtimestamp()比datetime.utcfromtimestamp()需要更长的时间

时间:2019-07-12 18:39:59

标签: python python-3.x performance datetime timestamp

我写了一个统计/ ML程序,它对时间序列数据进行一些数据分析。令人惊讶的是,当我使用fromtimestamp()方法获得时间戳时,我的程序将在大约15秒内执行,而当使用utcfromtimestamp()时,它将在一秒钟或更短时间内执行。

为了测试和比较它们的运行时,我运行了一个python程序:

timestamp = datetime.now().timestamp()

start = datetime.now()
date1 = datetime.fromtimestamp(timestamp)
print(datetime.now() - start)

start = datetime.now()
date2 = datetime.utcfromtimestamp(timestamp)
print(datetime.now() - start)

但是我发现fromtimestamp()在这种情况下总是更快。

Runtime of fromtimestamp - 00.000004
Approx Runtime of utcfromtimestamp - 0.000267

在我的程序中,fromtimestamp()大约需要0.4秒。

这里有一些隐藏的因素在起作用吗?注意,在我的ML程序中,我进行线程化和多处理。我不确定这是否是这里的原因。

1 个答案:

答案 0 :(得分:2)

隐藏的因素是datetime.fromtimestamp()产生当地时间。来自documentation

  

返回与POSIX时间戳相对应的本地日期和时间

datetime.utcfromtimestamp()返回UTC时间:

  

返回与POSIX时间戳相对应的UTC日期时间

POSIX时间戳始终以UTC表示时间,总是。因此,将数字转换为UTC datetime对象(无需时区转换)要简单得多,而不必先查找系统时区,然后再应用所需的时区调整。

这些功能之间的区别基本上归结为使用time.localtime()time.gmtime(),它们由localtime_r / gmtime_r函数(在POSIX系统上)或{ {3}} / localtime_s功能(在Windows上)。

您的计时测试存在严重缺陷。使用gmtime_s进行时间试用:

>>> from datetime import datetime
>>> import timeit
>>> timestamp = datetime.now().timestamp()
>>> timeit.timeit("datetime.fromtimestamp(timestamp)", "from __main__ import datetime, timestamp")
0.6479804780101404
>>> timeit.timeit("datetime.utcfromtimestamp(timestamp)", "from __main__ import datetime, timestamp")
0.2666302509896923

这表明datetime.utcfromtimestamp()更快,更一致。