我有一个大文件(5Gb),名为my_file
。我有一个名为my_list
。读取文件中每一行的最有效方法是什么,如果来自my_list
匹配以下行中的项目my_file
,创建一个名为的新列表matches
包含以下行中的项目my_file
以及来自的项目my_list
发生比赛的地方。这是我正在尝试做的事情:
def calc(my_file, my_list)
matches = []
my_file.seek(0,0)
for i in my_file:
i = list(i.rstrip('\n').split('\t'))
for v in my_list:
if v[1] == i[2]:
item = v[0], i[1], i[3]
matches.append(item)
return matches
这是其中的一些行my_file
:
lion 4 blue ch3
sheep 1 red pq2
frog 9 green xd7
donkey 2 aqua zr8
这里有一些项目my_list
intel yellow
amd green
msi aqua
在上面的示例中,所需的输出(列表的列表)将是:
[['amd', 9, 'xd7'], ['msi', 2, 'zr8']]
我的代码目前可以工作,尽管速度很慢。使用生成器或序列化有帮助吗?谢谢。
你可以建立一个字典来查找 v。我添加了进一步的小优化:
def calc(my_file, my_list)
vd = dict( (v[1],v[0]) for v in my_list)
my_file.seek(0,0)
for line in my_file:
f0, f1, f2, f3 = line[:-1].split('\t')
v0 = vd.get(f2)
if v0 is not None:
yield (v0, f1, f3)
对于大型企业来说这应该要快得多my_list
.
Using get
比检查是否更快i[2]
is in vd
+ 访问vd[i[2]]
为了获得超出这些优化的更多加速,我建议http://www.cython.org http://www.cython.org
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)