使用索引列表访问项列表
考虑一下从一个很大的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)
另一种是从第一行中整理出与名字相关的项目。
good_cols = [0,2,4, ... ,98,99]
while data:
...
data_line = [data_line[index] for index in good_cols]
在我使用的数据中,好的行肯定会比坏的行多,虽然可能会有一半一半的情况。
我使用了cProfile和pstats这两个工具来找出我程序中速度最慢的部分,结果显示去掉空列的操作是当前最慢的。我换成了列表推导,结果时间几乎翻倍。
我想一个快速的方法是切片数组,只获取好的数据,但对于那些有空白和好数据交替出现的文件,这会比较复杂。
我真正需要的是能够做到:
data_line = data_line[good_cols]
有效地将一组索引传入列表中,以获取那些项目。现在我的程序处理一个10MB的文件大约需要2.3秒,而去掉空列的操作大约占用了0.3秒。
有没有更快的方法来访问列表中的某些位置?在C语言中,这只需要解引用指向数组中正确索引的指针数组。
补充说明:
在读取文件之前的名字行。
a,b,c,d,e,f,g,,,,,h,i,j,k,,,,l,m,n,
读取并用逗号分割后的名字行。
['a','b','c','d','e','f','g','','','','','h','i','j','k','','','','l','m','n','\n']
1 个回答
12
试试生成器表达式,
data_line = (data_line[i] for i in good_cols)
另外,可以看看这里关于 生成器表达式和列表推导式的区别的内容。
正如最上面的回答所说:'基本上,如果你只是想遍历一次,使用生成器表达式就可以了'。
这样你应该会有所收获。