Python:在2mln行上循环
我必须循环使用2mln行的大文件,看起来像这样Python:在2mln行上循环,python,loops,Python,Loops,我必须循环使用2mln行的大文件,看起来像这样 P61981 1433G_HUMAN P61982 1433G_MOUSE Q5RC20 1433G_PONAB P61983 1433G_RAT P68253 1433G_SHEEP 目前我有以下函数,它获取列表中的每个条目,如果这个大文件中的条目-它获取了发生的行,但是速度很慢(约10分钟)。可能是由于循环方案,您能提出优化建议吗? up = "database.txt" def mplist(somelist): new
P61981 1433G_HUMAN
P61982 1433G_MOUSE
Q5RC20 1433G_PONAB
P61983 1433G_RAT
P68253 1433G_SHEEP
目前我有以下函数,它获取列表中的每个条目,如果这个大文件中的条目-它获取了发生的行,但是速度很慢(约10分钟)。可能是由于循环方案,您能提出优化建议吗?
up = "database.txt"
def mplist(somelist):
newlist = []
with open(up) as U:
for row in U:
for i in somelist:
if i in row:
newlist.append(row)
return newlist
somelist的示例
somelist = [
'P68250',
'P31946',
'Q4R572',
'Q9CQV8',
'A4K2U9',
'P35213',
'P68251'
]
如果您的somelist
仅包含在第一列中找到的值,则拆分该行并仅针对集而非列表测试第一个值:
def mplist(somelist):
someset = set(somelist)
with open(up) as U:
return [line for line in U if line.split(None, 1)[0] in someset]
针对集合的测试是一个O(1)恒定时间操作(与集合的大小无关)
演示:
您可能希望返回一个生成器,并且只进行筛选,而不在内存中生成列表:
def mplist(somelist):
someset = set(somelist)
with open(up) as U:
return (line for line in U if line.split(None, 1)[0] in someset)
您可以循环,但不能索引此结果:
for match in mplist(somelist):
# do something with match
并且不需要在内存中保存所有匹配的条目。如果您的somelist
仅包含在第一列中找到的值,则拆分该行并仅根据集合而不是列表测试第一个值
:
def mplist(somelist):
someset = set(somelist)
with open(up) as U:
return [line for line in U if line.split(None, 1)[0] in someset]
针对集合的测试是一个O(1)恒定时间操作(与集合的大小无关)
演示:
您可能希望返回一个生成器,并且只进行筛选,而不在内存中生成列表:
def mplist(somelist):
someset = set(somelist)
with open(up) as U:
return (line for line in U if line.split(None, 1)[0] in someset)
您可以循环,但不能索引此结果:
for match in mplist(somelist):
# do something with match
并且不需要在内存中保存所有匹配的条目。非常严格,但它返回空的list@millimoose:由于OP只需要针对每行的第一个值进行测试,因此不同的测试更简单。如果第一列的长度始终为6个字符,则不需要拆分。只需检查前6个字符。str.split对于大数据来说是一个代价很高的函数。如果仅将其限制为一个剥离,那么代价会更低,但是是的,一个切片的速度会更快。这已经足够了,但它返回的是空的list@millimoose:由于OP只需要针对每行的第一个值进行测试,因此不同的测试更简单。如果第一列的长度始终为6个字符,不需要拆分。只需检查前6个字符。str.split对于大数据来说是一个代价很高的函数。当它仅限于一个剥离时,代价会更低,但是是的,一个切片会更快。