简单的Python脚本运行非常慢(CSV文件)

2 投票
3 回答
3236 浏览
提问于 2025-04-18 00:06

我正在运行一个脚本,目的是把一些标题列恢复到一个CSV文件中。这个脚本会把原始文件里的标题列当作字典,然后把它们重新拼接到一个丢失了标题列的文件里。

问题是,这个过程非常慢。这两个文件都比较大(大约50MB),有20万行和96列。目前输出的文件在预览时看起来是正确的,但每10分钟大约只增加200KB。

我对编程完全不懂,所以如果有人能帮我找出这个脚本为什么这么慢,我会非常感激。

hapinfile = file('file_with_header_columns', 'r')
hapoutfile = file('file_missing_header_columns.csv', 'r')
o = file('filescombined.txt', 'w')

dictoutfile={}

for line in hapoutfile:
    a=line.rstrip('\n').rstrip('\r').split('\t')
    dictoutfile[a[0]]=a[1:]

hapinfile.close()

for line in hapinfile:
    q=line.rstrip('\n').rstrip('\r').split('\t')
    g=q[0:11]
    for key, value in dictoutfile.items():
        if g[0] == key:
            g.extend(value)
            o.write(str('\t'.join(g)+'\n'))


hapoutfile.close()
o.close()

3 个回答

-1
from __future__ import with_statement   # if you need it

import csv 

with open('file_with_header_columns', 'r') as hapinfile,
         open('file_missing_header_columns', 'r') as hapoutfile,
         open('filescombined.txt', 'w') as outfile:
    good_data = csv.reader(hapoutfile, delimiter='\t')
    bad_data = csv.reader(hapinfile, delimiter='\t')
    out_data = csv.writer(outfile, delimiter='\t')
    for data_row in good_data:
        for header_row in bad_data:
            if header_row[0] == data_row[0]
                out_data.writerow(data_row)
                break   # stop looking through headers

看起来你遇到了一个很麻烦的问题,因为你需要使用嵌套循环来查找数据。如果你能按照表头字段对CSV文件进行排序,那样会更高效。现在的情况是,利用CSV模块,把所有内容简化一下。你可以使用break这个命令,虽然在for循环中用起来有点奇怪,但一旦你找到了表头,它至少可以让你快速跳出对第二个文件的搜索。

0

首先,你在第二部分的代码里不需要那个内部循环。你正在遍历一个字典,其实可以直接用 g[0] 作为键来获取值。这样做可以省去对一个很大的字典的循环,这个循环会在每一行没有标题的文件中执行。如果需要的话,你可以先检查 g[0] 是否在字典里,这样可以避免出现键错误。

0

这个程序运行得很慢,是因为里面有个嵌套的 for 循环,它一次又一次地在字典里重复查找,根本没有必要。你可以试试这样做:

for line in hapinfile:
    q=line.rstrip('\n').rstrip('\r').split('\t')
    g=q[0:11]
    if g[0] in dictoutfile:
        g.extend( dictoutfile[g[0]] )
        o.write(str('\t'.join(g)+'\n'))

撰写回答