简单的Python脚本运行非常慢(CSV文件)
我正在运行一个脚本,目的是把一些标题列恢复到一个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'))