使用2个for循环加速python代码

使用2个for循环加速python代码,python,performance,file,Python,Performance,File,我有以下python代码片段,我想加快速度: in_file1 = open('file1.txt', 'r') for line1 in in_file: col1,col2,col3,col4=line1.rstrip.split("\t") with open('flie2.txt', 'r') as in_file2: for line2 in in_file2: col1,col2,col3,col4=line2.rstrip.

我有以下python代码片段,我想加快速度:

in_file1 = open('file1.txt', 'r')

for line1 in in_file:
    col1,col2,col3,col4=line1.rstrip.split("\t")
    with open('flie2.txt', 'r') as in_file2:
        for line2 in in_file2:
            col1,col2,col3,col4=line2.rstrip.split("\t")
            if col1 in line1 == col1 in line2:
                print the line from file2
文件大小以GB为单位。有人能建议一种(或多种)方法来替换for循环以加速代码吗


谢谢,您可以从file1中创建一组第一个元素,然后测试成员资格

with open('file1.txt', 'r') as in_file1, open('file2.txt', 'r') as in_file2:
    cols_set = {line.split("\t", 1)[0] for line in in_file1}
    for line in in_file2:
        if line.split("\t",1)[0] in cols_set:
            print(line)

您可以从file1创建一组第一个元素,然后测试成员资格

with open('file1.txt', 'r') as in_file1, open('file2.txt', 'r') as in_file2:
    cols_set = {line.split("\t", 1)[0] for line in in_file1}
    for line in in_file2:
        if line.split("\t",1)[0] in cols_set:
            print(line)

如果内存和性能都存在问题,那么您可以使用生成器将文件分成可管理大小的块,这些块被读入内存,并将文件1中的每个块与文件2中的每个块进行比较。还请注意,我们可以只注意文件1中的第一列,因此不必将其余的行存储在内存中

def get_chunks(file_name, lines, operation=lambda x:x):
    with open(file_name, 'r') as file:
        chunk = []
        for line in file:
            chunk.append(operation(line))
            if len(chunk) == lines:
                yield chunk
                chunk = []

def get_first_column(line):
    return line.split('\t')[0]

for chunk1 in get_chunks('file1.txt', 10000, operation=get_first_column):
    for chunk2 in get_chunks('file2.txt', 1000):
        for line in chunk2:
            if get_first_column(line) in chunk1:
                print line

如果内存和性能都存在问题,那么您可以使用生成器将文件分成可管理大小的块,这些块被读入内存,并将文件1中的每个块与文件2中的每个块进行比较。还请注意,我们可以只注意文件1中的第一列,因此不必将其余的行存储在内存中

def get_chunks(file_name, lines, operation=lambda x:x):
    with open(file_name, 'r') as file:
        chunk = []
        for line in file:
            chunk.append(operation(line))
            if len(chunk) == lines:
                yield chunk
                chunk = []

def get_first_column(line):
    return line.split('\t')[0]

for chunk1 in get_chunks('file1.txt', 10000, operation=get_first_column):
    for chunk2 in get_chunks('file2.txt', 1000):
        for line in chunk2:
            if get_first_column(line) in chunk1:
                print line
用法:

for line in my_func('file1.txt', 'file2.txt'):
    print(line)
用法:

for line in my_func('file1.txt', 'file2.txt'):
    print(line)


你为什么要在循环中打开文件?对不起,伙计们。现在编辑代码以解决您的问题。只要试着比较两个需要加速的大文件的内容,你想把file1中每一行的第一个元素与file2中的相同元素进行比较吗?@user27976这些文件的大小是多少?`而且变量仍然混乱,你使用了两次相同的变量名。你正在重新定义
col1
col2
,嵌套for循环中的
col3
col4
,因此示例中的第4行是完全冗余的。为什么要在循环中打开文件?对不起,伙计们。现在编辑代码以解决您的问题。只要试着比较两个需要加速的大文件的内容,你想把file1中每一行的第一个元素与file2中的相同元素进行比较吗?@user27976这些文件的大小是多少?`而且变量仍然混乱,你使用了两次相同的变量名。你正在重新定义
col1
col2
,嵌套for循环中的
col3
col4
,因此示例中的第4行是完全冗余的。这肯定会降低时间复杂度。但是考虑到文件很大(GB),OP可能会耗尽内存。@AshwiniChaudhary,这是一种可能性,它也有可能会工作并且效率更高,但是不知道“巨大”到底有多大,或者OP必须使用多少内存,讨论起来是相当徒劳的。比较一下file2行的第一个元素是否是在file1行的第一个元素上显示“present”,但不检查它是否相同line@LudovicViaud,您认为嵌套循环在OP的代码中做了什么?
如果第1行中的col1==第2行中的col1:
如果OP在逐行比较,这将非常简单。我误解了OP的说法”是的,将文件1中每一行的第一个元素与文件2中的相同元素进行比较”,我以为他说的是同一行,这肯定会减少时间复杂性。但是考虑到文件很大(GB),OP可能会耗尽内存。@AshwiniChaudhary,这是一种可能性,它也可能会工作并且效率更高,但如果不知道“巨大”有多大,或者OP必须使用多少内存,那么讨论是相当徒劳的。比较文件2行的第一个元素是否“存在”“在file1行的第一个元素上,但不检查它是否相同line@LudovicViaud,您认为嵌套循环在OP的代码中做了什么
如果第1行中的col1==第2行中的col1:
如果OP在一行一行地比较,那会非常简单。我误解了,因为OP说“是的,将文件1中每一行的第一个元素与文件2中的相同元素进行比较”,我以为他说的是同一行