Python 的 strftime 是否有更快的替代方案?
Is there a faster alternative to Python's strftime?
我在 Python 中处理数十万个日期并注意到 strftime
函数非常慢。
我用 timeit 进行了检查,它告诉我大约需要 0.004,这对于小数字来说没问题,但是对于处理几千个数字就成了问题。
print(min(timeit.Timer("now.strftime('%m/%d/%Y')", setup=setup).repeat(7,1000))
有没有更快的选择?
这在我的盒子上稍快一些 (python 2.7.x)
def fmt(date):
return "%02d/%02d/%d" % (date.month, date.day, date.year)
由于您有严格的格式,您可以直接访问 datetime
对象的字段并使用 Python 字符串格式来构造所需的字符串:
'{:02d}/{:02d}/{}'.format(now.month, now.day, now.year)
在 Python 3 中,这比 strftime()
快大约 4 倍。它在 Python 2 中也更快,大约快 2-3 倍。
在Python3中再次更快是"old"风格的字符串插值:
'%02d/%02d/%d' % (now.month, now.day, now.year)
大约快了 5 倍,但我发现这个对于 Python 2 来说要慢一些。
另一个选项,但速度只有 1.5 倍,是使用 time.strftime()
而不是 datetime.strftime()
:
time.strftime('%m/%d/%Y', now.timetuple())
最后,您如何开始构建 datetime
对象?如果您要将字符串转换为 datetime
(例如 strptime()
),使用字符串切片将传入的字符串版本转换为传出的字符串版本可能会更快。
我在 Python 中处理数十万个日期并注意到 strftime
函数非常慢。
我用 timeit 进行了检查,它告诉我大约需要 0.004,这对于小数字来说没问题,但是对于处理几千个数字就成了问题。
print(min(timeit.Timer("now.strftime('%m/%d/%Y')", setup=setup).repeat(7,1000))
有没有更快的选择?
这在我的盒子上稍快一些 (python 2.7.x)
def fmt(date):
return "%02d/%02d/%d" % (date.month, date.day, date.year)
由于您有严格的格式,您可以直接访问 datetime
对象的字段并使用 Python 字符串格式来构造所需的字符串:
'{:02d}/{:02d}/{}'.format(now.month, now.day, now.year)
在 Python 3 中,这比 strftime()
快大约 4 倍。它在 Python 2 中也更快,大约快 2-3 倍。
在Python3中再次更快是"old"风格的字符串插值:
'%02d/%02d/%d' % (now.month, now.day, now.year)
大约快了 5 倍,但我发现这个对于 Python 2 来说要慢一些。
另一个选项,但速度只有 1.5 倍,是使用 time.strftime()
而不是 datetime.strftime()
:
time.strftime('%m/%d/%Y', now.timetuple())
最后,您如何开始构建 datetime
对象?如果您要将字符串转换为 datetime
(例如 strptime()
),使用字符串切片将传入的字符串版本转换为传出的字符串版本可能会更快。