2014-11-16 4 views
0

У меня есть следующий питон фрагмент кода, который я хотел бы ускорить:ускоряя код питона с 2 для петель

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 

размеров файлов в ГБ. Может ли кто-нибудь предложить способ (или способы) заменить циклы for для ускорения кода?

Благодаря

+4

почему вы открываете файл в цикле? –

+0

извините, ребята. код теперь отредактирован для решения ваших вопросов. просто попробуйте сравнить содержимое двух огромных файлов, которые нуждаются в ускорении – user27976

+0

, поэтому вы хотите сравнить первый элемент из каждой строки файла1 с тем же файлом2? –

ответ

2

Вы могли бы сделать набор из первых элементов из 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

Это, безусловно, уменьшит временную сложность. Но, учитывая, что файлы огромны (GB), OP может закончиться нехваткой памяти. –

+0

@AshwiniChaudhary, это возможно, также возможно, что он будет работать и будет намного более эффективным, но не зная точно, насколько велика «огромная» или сколько памяти, с которой OP должен работать с ней, довольно бесполезно обсуждать. –

+0

вы сравниваете, если первый элемент строк файла2 «присутствует» в первом элементе строк файла1, но вы не проверяете, имеет ли он одну и ту же строку –

1

Если памяти и производительности являются проблемой, то вы можете использовать генератор, чтобы разорвать файлы которые считываются в память и сравнивают каждый фрагмент в файле 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
def my_func(file_name_1, file_name_2): 
    for line_1 in open(file_name_1): 
     for line_2 in open(file_name_2): 
      if line_1.split('\t')[0] == line_2.split('\t')[0]: 
       yield line_2 

использование:

for line in my_func('file1.txt', 'file2.txt'): 
    print(line) 
Смежные вопросы