python中的高效字符串比较,包括数值评估
作者:互联网
我有两个中等大小的ascii文件,其中包含固定格式的数据.我需要测试第一个文件的一行中的6个给定字段是否匹配(在给定的公差范围内)第二个文件的任何一行中的六个字段,然后输出一条公共行以继续处理.
我目前正在使用fortran样式的行读取器拆分文件中的每一行,并为每个列表中的每个元素生成具有正确类型的列表列表.我将两个文件的列表列表存储在内存中,同时对其进行操作
我需要比较的字段都是浮点数,我目前正在使用以下类型的流:
tol = 0.01
for entry1 in file1List:
for entry2 in file2List:
if (abs(entry1[1] - entry2[1]) < tol and abs(entry1[2] - entry2[2]) < tol
and abs(entry1[3] - entry2[3]) < tol and abs(entry1[4] - entry2[4]) < tol
and abs(entry1[5] - entry2[5]) < tol and abs(entry1[6] - entry2[6]) < tol):
print entry1,entry2
对于仅包含少量行的文件,执行此操作很好,但是超过30000行,仅此部分的执行就超过1分钟!
我相当肯定必须有一个更快的比较方法,但是我正在努力寻找它,任何帮助将不胜感激.
解决方法:
如果您可以将元素存储在file1list和file2list中作为numpy数组,则您的比较会变得更加简单(并且可能也会更快):
for entry1 in file1list:
for entry2 in file2list:
if(np.all(np.abs(entry1[1:7] - entry2[1:7]) > tol)):
print entry1,entry2
转换为numpy数组很容易:
file1list = [ np.array(entry) for entry in file1list ]
对于已排序的file2list,这甚至会更好一点
file2list=sorted(file2list,key=operator.itemgetter(1,2,3,4,5,6))
for entry1 in file1list:
for entry2 in file2list:
d=np.abs(entry1[1:7]-entry2[1:7])
if(np.all(d < tol)):
print entry1,entry2
elif(d[0] > tol):
break
标签:optimization,string-comparison,python 来源: https://codeday.me/bug/20191101/1980734.html