ISO8601转换器的最快日期时间

2024-04-29 01:32:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找将Python datetime对象呈现为ISO8601字符串的最快方法。有几种不同的方法可以实现这一点,本机datetime模块有strftimeisoformat和平面旧__str__。还有许多其他的奇异的方法,例如摆锤(https://pendulum.eustace.io/),xml.utils.iso8601.tostring,以及这里的一些其他方法https://wiki.python.org/moin/WorkingWithTime

我希望有类似ciso8601的东西,它有一个比较多种方法的伟大基准:https://github.com/closeio/ciso8601#benchmark


Tags: 模块对象方法字符串httpsdatetime平面str
1条回答
网友
1楼 · 发布于 2024-04-29 01:32:42

我对我能找到的所有不同方法进行了基准测试,结果如下:

  • datetime.strftime-1000000个循环的时间:9.262935816994286
  • 转换为字符串-1000000个循环的时间:4.381643378001172
  • 日期时间异构格式-1000000个循环的时间:4.3315785777999608
  • 摆锤到iso8601_字符串-1000000个循环的时间:18.471532950992696
  • rfc3339-1000000次循环的时间:24.731586036010412

生成此代码的代码是:

import timeit
from datetime import datetime
from pendulum import datetime as pendulum_datetime
from rfc3339 import rfc3339

dt = datetime(2011, 11, 4, 0, 5, 23, 283000)
pendulum_dt = pendulum_datetime(2011, 11, 4, 0, 5, 23, 283000)

repeats = 10**6

print('datetime strftime')
func1 = lambda: datetime.strftime(dt, "%Y-%m-%dT%H:%M:%S.%f%z")
print(func1())
print('Time for {0} loops: {1}'.format(
    repeats, timeit.timeit(func1, number=repeats))
    )

print('cast to string')
func2 = lambda: str(dt)
print(func2())
print('Time for {0} loops: {1}'.format(
    repeats, timeit.timeit(func2, number=repeats))
    )

print('datetime isoformat')
func3 = lambda: datetime.isoformat(dt)
print(func3())
print('Time for {0} loops: {1}'.format(
    repeats, timeit.timeit(func3, number=repeats))
    )

print('pendulum to_iso8601_string')
func4 = lambda: pendulum_dt.to_iso8601_string()
print(func4())
print('Time for {0} loops: {1}'.format(
    repeats, timeit.timeit(func4, number=repeats))
    )

print('rfc3339')
func5 = lambda: rfc3339(dt)
print(func5())
print('Time for {0} loops: {1}'.format(
    repeats, timeit.timeit(func5, number=repeats))
    )

相关问题 更多 >