我一直致力于一个非常简单的程序,其主旨如下所示:
post = open(INPUTFILE1, "rb")
for line in post:
cut = line.split(',')
pre = open(INPUTFILE2, "rb")
for otherline in pre:
cuttwo = otherline.split(',')
if cut[1] == cuttwo[1] and cut[3] == cuttwo[3] and cut[9] == cuttwo[9]:
OUTPUTFILE.write(otherline)
break
post.close()
pre.close()
OUTPUTFILE.close()
有效的是,将两个csv文件作为输入(“pre”和“post”)。它查看“post”数据中的第一行,并尝试在第2列,第4列和第10列匹配的“pre”数据中查找一行。如果匹配,则将“pre”数据写入a新文件。
它工作正常,但它需要永远。虽然我的“帖子”数据可能只有几百行(最多可能是一千行),但我的“预售”可能有多达1500万行。因此,可能需要10个小时才能完成。
我对Python很新,所以我还没有学到很多优化技术。有没有人有任何关于我可以尝试的指示?显然,我理解当我搜索整个“预”数据以进行匹配时,就会发生僵局。有没有办法加快速度呢?
答案 0 :(得分:4)
如果你只有几百个有潜力的行,那就使用类似的东西:
from operator import itemgetter
key = itemgetter(1, 3, 9)
with open('smallfile') as fin:
valid = set(key(line.split(',')) for line in fin)
with open('largerfile') as fin:
lines = (line.split(',') for line in fin)
for line in lines:
if key(line) in valid:
# do something....
这样可以节省不必要的迭代次数,并充分利用内置的Python进行高效查找。
如果你想在输出中使用小文件的整行,如果匹配,那么使用字典而不是集合:
from operator import itemgetter
key = itemgetter(1, 3, 9)
with open('smallfile') as fin:
valid = dict((key(line.split(',')), line) for line in fin)
然后你的处理循环就像:
with open('largerfile') as fin:
lines = (line.split(',') for line in fin)
for line in lines:
otherline = valid.get(key(line), None)
if otherline is not None:
# do something....