2013-10-02 87 views
2

我下面的代码工作正常,但远过于缓慢。我将不胜感激任何帮助,您可以提供:优化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的更简单的方法...

+0

有什么特别之处的数据(如被它排序)?数据是否足够小以至于您可以将其保存在内存中? – Michael

+0

谢谢迈克尔。数据没有排序。我不积极,但我很确定我可以把它放在记忆里。 – user7186

+0

好像在所有的数据要么抓住阅读和在哈希表中存储(即'dict'),你应该能够得到您的索引快速查找。现在你正在通过阅读每个循环中的文件2和文件3来重复工作。 – Michael

回答

1

原因之一,如果这是真的确实生活在一个关系数据库中,为什么不用一些精心措辞的选择做一个大的加入?

如果我这样做,我会使用pandas.DataFrame并将3个表合并在一起,然后我将遍历每一行并使用合适的逻辑将生成的“连接”ed数据集转换为单个最终结果。

+0

谢谢!熊猫完美无缺! – user7186

+0

很高兴我能帮到你。大约两周前我发现了熊猫,并将它用于两个完全无关的项目。我喜欢这些合并的速度。 – user632657