考虑从大型csv文件(80 MB)返回的大型命名项(第一行),可能存在间隔
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是当前最慢的项目。我切换到列表comp,时间几乎加倍。
我想一种快速的方法是切片检索只有好数据的数组,但对于具有交替空白和良好数据的文件来说这会很复杂。
我真正需要的是能够做到
data_line = data_line[good_cols]
有效地将索引列表传递到列表中以获取这些项目。 现在我的程序在大约2.3秒内运行10 MB文件,弹出帐户大约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']
答案 0 :(得分:10)
尝试使用生成器表达式
data_line = (data_line[i] for i in good_cols)
此处也可以阅读 Generator Expressions vs. List Comprehension
正如最顶层的回答告诉你的那样:'基本上,如果您所做的只是迭代一次,请使用生成器表达式。
所以你应该从中受益。