efi*_*efi 3 python performance python-3.x
尝试将大量记录(时间序列)转换为 int ,如下所示:
seconds_time = int(time.mktime(time.strptime(parts[0], '%Y%m%d %H%M%S')))
Run Code Online (Sandbox Code Playgroud)
不幸的是,这是代码的瓶颈(耗时约20倍)。有什么建议可以改进它吗?
提前致谢
实际上有一种方法可以大大减少解析时间。
import time
start = time.time()
nb_loops = 1000000
time_string = "20170101 201456"
for i in range(nb_loops):
seconds_time = int(time.mktime(time.strptime(time_string, '%Y%m%d %H%M%S')))
print(time.time()-start)
Run Code Online (Sandbox Code Playgroud)
第一个循环在 12 秒内运行。我承认不是很好。
但是,由于您的格式很简单,为什么不在列表理解中使用带切片的整数转换(并为缺少的字段添加 0,例如毫秒,...)并将结果传递给mktime.
start = time.time()
for i in range(nb_loops):
seconds_time = time.mktime(tuple([int(time_string[s:e]) for s,e in ((0,4),(4,6),(6,8),(9,11),(11,13),(13,15))]+[0,0,0]))
print(time.time()-start)
Run Code Online (Sandbox Code Playgroud)
在 3 秒内运行(保存'%Y%m%d %H%M%S'格式字符串的解析,这似乎需要一段时间)。
使用编译的正则表达式稍微快一点:
import re
r = re.compile("(....)(..)(..) (..)(..)(..)")
start = time.time()
for i in range(nb_loops):
seconds_time = time.mktime(tuple(map(int,r.match(time_string).groups()))+(0,0,0))
print(time.time()-start)
Run Code Online (Sandbox Code Playgroud)
结果:
basic 14.41410493850708
string slicing 3.1356000900268555
regex 2.8703999519348145
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
454 次 |
| 最近记录: |