我有 2 个 csv 文件。第一个,input
,由带有各种错误的输入街道地址组成。第二,ref
是一个干净的街道地址表。内的记录input
需要与内的记录相匹配ref
。将文件转换为具有唯一记录的列表很快,但是一旦我进入匹配过程,它就非常慢,需要整整 85 秒才能匹配两个地址input
,ref
而不需要任何正则表达式!我意识到ref
是这里的问题;它的长度超过 100 万条记录,文件大小为 30 MB。我预计这些大小会出现一些性能问题,但是只为两条记录花费这么长时间是不可接受的(实际上,我可能必须匹配多达 10,000 条或更多记录。此外,我最终需要将一些正则表达式嵌入到ref
项目中以允许更灵活的匹配。测试新的正则表达式模块更糟糕,同样的两条input
记录需要高达 185 秒的时间。有人知道大幅加快速度的最佳方法吗?例如,我可以按邮政编码索引吗?
以下是分别来自 input 和 ref 的示例地址(预处理后):
60651 N SPRINGFIELD AVE CHICAGO
60061 BROWNING CT VERNON HILLS
这是我到目前为止所拥有的。(作为一个新手,我意识到我的代码可能存在各种低效率,但这不是问题):
import csv, re
f = csv.reader(open('/Users/benjaminbauman/Documents/inputsample.csv','rU'))
columns = zip(*f)
l = list(columns)
inputaddr = l[0][1:]
f = csv.reader(open('/Users/benjaminbauman/Documents/navstreets.csv','rU'))
f.next()
reffull = []
for row in f:
row = str(row[0:7]).strip(r'['']').replace("\'","")
if not ", , , , ," in row: reffull.append(row)
input = list(set(inputaddr))
ref1 = list(set(reffull))
ref2 = ref1
input_scrub = []
for i in inputaddr:
t = i.replace(',',' ')
input_scrub.append(' '.join(t.split()))
ref_scrub = []
for i in ref1:
t = i.replace(',',' ')
ref_scrub.append(' '.join(t.split()))
output_iter1 = dict([ (i, [ r for r in ref_scrub if re.match(r, i) ]) for i in input_scrub ])
unmatched_iter1 = [i for i, j in output_iter1.items() if len(j) < 1]
matched_iter1 = {i: str(j[0][1]).strip(r'['']') for i, j in output_iter1.items() if len(j) is 1}
tied_iter1 = {k: zip(*(v))[1] for k,v in output_iter1.iteritems() if len(v) > 1}