优化Python CSV读取器性能

时间:2013-10-02 19:27:56

标签: python performance 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 ...

1 个答案:

答案 0 :(得分:1)

首先,如果这确实存在于关系数据库中,为什么不只是用一些精心设计的选择来进行大型连接?

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