我写了一个统计/ 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程序中,我进行线程化和多处理。我不确定这是否是这里的原因。
答案 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()
更快,更一致。