在格式化当前时间时,习惯使用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())