我正在做这样的事情来总结一行的一些元素:
for line in open(filename, 'r'):
big_list = line.strip().split(delim)
a = sum(int(float(item)) for item in big_list[start:end] if item)
# do some other stuff
这是用一个大文件逐行完成的,其中一些项目可能会丢失,即等于''。如果我使用上面的语句来计算 a,脚本会比没有它慢得多。有没有办法加快速度?
最佳答案
这没有经过测试,但凭直觉我希望跳过中间 float 转换会有所帮助。你想获取小数点左边的整数,所以我会尝试通过正则表达式直接这样做:
import re
pattern = re.compile("\d+")
然后用正则表达式匹配替换浮点解析:
sum(int(pattern.search(item).group(0)) for item in big_list[start:end] if item)
如果您不需要保留旧的十进制字符串,您还可以在构建 big_list
时即时获取这些字符串。例如,假设我们有行 "6.0,,1.2,3.0,"
。我们可以得到这样的匹配:
delim = ","
pattern = re.compile("(\d+)\.\d+|" + re.escape(delim) + re.escape(delim) + "|$")
该模式的结果为:['6', '', '1', '3', '']
,然后可以像往常一样对其进行切片和过滤无需浮点解析:
for line in open(filename, 'r'):
big_list = pattern.findall(line)
a = sum(int(item) for item in big_list[start:end] if item)
关于python - 将列表项转换为 int 并将它们相加的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25388796/