【问题标题】:datetime.fromtimestamp() takes longer than datetime.utcfromtimestamp()datetime.fromtimestamp() 比 datetime.utcfromtimestamp() 花费更长的时间
【发布时间】:2019-11-22 13:07:36
【问题描述】:

我编写了一个统计/机器学习程序,对时间序列数据执行一些数据分析。令人惊讶的是,当我使用 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 程序中,我执行线程和多处理。我不确定这是否是这里起作用的因素。

【问题讨论】:

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


    【解决方案1】:

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

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

    datetime.utcfromtimestamp() 返回 UTC 时间:

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

    POSIX 时间戳代表 UTC 时间,总是。因此,将该数字转换为 UTC datetime 对象(无需时区转换)比查找系统时区然后应用所需的时区调整要简单得多。

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

    您的计时测试存在严重缺陷。使用timeit module 运行时间试验:

    >>> 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() 更快、更稳定。

    【讨论】:

    • 但是,它始终运行得更快(在一个线程上)。它是否访问了一些有锁的系统,从而在多线程期间减慢了进程?很抱歉,我不相信看到从我的 python 程序打印的运行时。
    • @VaibhavBajaj:不,您的计时测试有缺陷,抱歉。
    • 哦!哇,太不准确了。我会搜索原因。非常感谢。
    猜你喜欢
    • 2012-02-18
    • 2014-06-19
    • 2019-08-24
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    相关资源
    最近更新 更多