Python:在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

我必须循环使用2mln行的大文件,看起来像这样

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对于大数据来说是一个代价很高的函数。当它仅限于一个剥离时,代价会更低,但是是的,一个切片会更快。