我下面的代码工作正常,但远过于缓慢。我将不胜感激任何帮助,您可以提供:优化Python的CSV阅读性能
import gf
import csv
cic = gf.ct
cii = gf.cit
li = gf.lt
oc = "Output.csv"
with open(cic, "rb") as input1:
reader = csv.DictReader(cie,gf.ctih)
with open(oc,"wb") as outfile:
writer = csv.DictWriter(outfile,gf.ctoh)
writer.writerow(dict((h,h) for h in gf.ctoh))
next(reader)
for ci in reader:
row = {}
row["ci"] = ci["id"]
row["cyf"] = ci["yf"]
with open(cii,"rb") as ciif:
reader2 = csv.DictReader(ciif,gf.citih)
next(reader2)
with open(li, "rb") as lif:
reader3 = csv.DictReader(lif,gf.lih)
next(reader3)
for cii in reader2:
if ci["id"] == cii["id"]:
row["ci"] = cii["ca"]
for li in reader3:
if ci["id"] == li["en_id"]:
row["cc"] = li["c"]
writer.writerow(row)
我打开reader2和reader3在读者中的每一行是因为读者对象遍历一次,那么原因就完成了。但是必须有更高效的方式来做到这一点,我将不胜感激您提供的任何帮助!
如果有帮助,这个代码背后的直觉是:从输入文件1,抓住两个单元;看输入文件2是否与输入文件1有相同的主键,如果是这样,从输入文件2中抓取一个单元格,并用另外两个保存的单元格保存;查看输入文件3是否与输入文件1中的主键相同,如果是这样,请从inputfile3中获取一个单元格并保存。然后输出这四个值。也就是说,我从规范化表中获取元数据,并试图对其进行非规范化处理。在Python中必须有一种非常高效的方法。当前代码的一个问题是,我通过读者对象迭代,直到我找到相关的ID,当必须有搜索的读者对象指定ID的更简单的方法...
有什么特别之处的数据(如被它排序)?数据是否足够小以至于您可以将其保存在内存中? – Michael
谢谢迈克尔。数据没有排序。我不积极,但我很确定我可以把它放在记忆里。 – user7186
好像在所有的数据要么抓住阅读和在哈希表中存储(即'dict'),你应该能够得到您的索引快速查找。现在你正在通过阅读每个循环中的文件2和文件3来重复工作。 – Michael