编程语言
首页 > 编程语言> > python中的高效字符串比较,包括数值评估

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