考虑一个由大型csv文件(80MB)返回的具有可能间断间隔的大量命名项列表(第一行)
name_line = ['a',,'b',,'c' .... ,,'cb','cc']
我正在逐行读取剩下的数据,我只需要处理相应名称的数据。 数据可能是这样的
data_line = ['10',,'.5',,'10289' .... ,,'16.7','0']
我尝试了两种方法。一种是从读取的每行中弹出空列。
blnk_cols = [1,3, ... ,97]
while data:
...
for index in blnk_cols: data_line.pop(index)
另一个是从L1编译与名称相关联的项目。
good_cols = [0,2,4, ... ,98,99]
while data:
...
data_line = [data_line[index] for index in good_cols]
在我使用的数据中,好行的数量肯定比坏行多,虽然可能达到一半。
我使用了cProfile和pstats包来确定速度最慢的地方,结果表明pop是当前最慢的项目。我尝试使用列表推导式,但时间几乎翻倍了。
我想象中一种快速的方法是切片数组,只检索好的数据,但对于交替空白和好数据的文件来说,这将很复杂。
我真正需要的是能够执行以下操作:
data_line = data_line[good_cols]
有效地传递索引列表到另一个列表中以获取这些项目。目前我的程序对于一个10MB的文件运行约为2.3秒,并且弹出帐户大约需要0.3秒。
是否有更快的方法来访问列表中的特定位置?在C语言中,只需将指向正确索引的指针数组取消引用即可。
补充说明:在读取之前文件中的name_line。
a,b,c,d,e,f,g,,,,,h,i,j,k,,,,l,m,n,
读取并使用逗号分隔符切割后的name_line
['a','b','c','d','e','f','g','','','','','h','i','j','k','','','','l','m','n','\n']
split(",")
解析 CSV 文件?使用csv
模块会更好,因为它可以为你处理大部分工作。 - S.Lott