对比python的datetime和time的strftime

在格式化当前时间时,习惯使用datetime.now().strftime('%Y-%m-%d %H:%M:%S'),后来发现time模块也有一样的功能,time.strftime('%Y-%m-%d %H:%M:%S')。返回的结果完全一样,查询manual发现time模块是对libc里的time.h相关功能的封装,而datetime则是python实现。

测试一下性能,果然差异很大,time.strftime()要快一倍还多,对于打印日志,换个函数就能获利明显额外的收益。

t1 = time.time()
for i in range(10000):
    t = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
t2 = time.time()
print(t2-t1, t)

t1 = time.time()
for i in range(10000):
    t = time.strftime('%Y-%m-%d %H:%M:%S')
t2 = time.time()
print(t2-t1, t)

输出为:

0.05356645584106445 2019-12-23 14:34:29
0.016568422317504883 2019-12-23 14:34:29

不过实际测试表明datetime.strptime()和time.strptime()没有性能差别,只是前者返回datetime()对象,后者返回struct_time()。

另外一点,尽管时间的展示上都有查询系统时区设置,但是对于时区格式化%z,datetime.strftime()没有支持,而time.strftime()是有支持的:

>>> datetime.now().strftime('%z')
>>> ''

>>> time.strftime('%z')
>>> '+0800'

在libc里面,gmtime是不查询时区的,它会快得多,这个时候可以手动加上28800秒,或者是结果上拼上'+0800',不过,对于前者,由于在python里要调用的函数较多,性能优势并不明显:

t = time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(time.time() + 28800))
t = time.strftime('%Y-%m-%d %H:%M:%S +0800', time.gmtime())

 

发表于 2019年12月23日 14:53   评论:0   阅读:2669  



回到顶部

首页 | 关于我 | 关于本站 | 站内留言 | rss
python logo   django logo   tornado logo