Python的strftime有更快的替代品吗?

7
我正在使用Python处理数十万个日期,发现strftime函数速度相当慢。我使用timeit进行检查,它告诉我它大约需要0.004秒,这对于小数量来说还不错,但是对于例如处理几千个日期就会成为问题。
print(min(timeit.Timer("now.strftime('%m/%d/%Y')", setup=setup).repeat(7,1000))

有更快的替代方案吗?

我不这么认为。如果条目重复出现,可以考虑缓存;或者将其拆分成线程(但是这非常容易出错)。 - gonczor
这个可能会有帮助:https://dev59.com/pmYr5IYBdhLWcg3ws8NT - Ajay Singh
1
@AjaySingh:那个问题是关于strptime,将字符串转换为时间戳的函数。这个问题是关于strftime,时间戳转换为字符串的函数。 - jwodder
1
在大多数Python实现中,将任务分割成线程并不能帮助CPU密集型任务,因为通常存在全局锁,阻止线程同时运行。 - Michael Mior
2个回答

7

由于你有一个严格的格式,你可以直接访问datetime对象的字段,并使用Python字符串格式化来构建所需的字符串:

'{:02d}/{:02d}/{}'.format(now.month, now.day, now.year)

在Python 3中,这比strftime()快约4倍。在Python 2中也更快,大约快2-3倍。
在Python 3中,旧式的字符串插值方式更快:
'%02d/%02d/%d' % (now.month, now.day, now.year)

这个方法大约比原来的快5倍,但我发现它在Python 2中运行较慢。

另一个选择是使用time.strftime() 而不是 datetime.strftime(),速度只会快1.5倍:

time.strftime('%m/%d/%Y', now.timetuple())

最后,你是如何构建datetime对象的?如果你正在使用字符串进行datetime转换(例如使用strptime()),那么使用字符串切片将传入的字符串版本转换为传出的版本可能会更快。


非常感谢,我现在正在尝试这些。本质上,我有一个日期时间对象,并希望输出类似于“12月10日星期四上午10:44”的内容。日期时间直接来自数据库。 - skittles789
将星期几映射为星期名称更加困难,会减缓这些替代方法的速度。月份名称也是如此。假设您实际上不需要 datetime 对象,或许您可以选择从数据库中以所需格式作为字符串选择日期?(或者您可以同时获取一个 datetime 对象和它的字符串表示形式) - mhawke
我意识到我不能这样做,因为在数据库调用之后还有一些额外的时区转换。所以我选择了你建议的使用 time.strftime 的方法,这非常出色,足以提高性能,而且工作得很好 :)。感谢你的帮助! - skittles789
你不知道其他的技巧吗?只是好奇是否还有其他能够快速获得成功的方法。 - skittles789
最好的方法可能是在数据库中完成工作,如果可以的话。这取决于使用的数据库 - 是哪一个?时区转换是什么?它将UTC转换为本地时间吗?除此之外,我不知道从datetime对象生成输出字符串的更快的方法。 - mhawke

0

在我的电脑上(Python 2.7.x),这会稍微快一些。

def fmt(date):
    return "%02d/%02d/%d" % (date.month, date.day, date.year)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接