2015-07-09 21 views
5

У меня есть входной файл со списком строк.Улучшение скорости скрипта python

Я повторяю каждую четвертую строку, начиная со строки два.

С каждой из этих строк я делаю новую строку из первого и последнего 6 символов и помещаю ее в выходной файл, только если эта новая строка уникальна.

Код, который я написал для этого, но я работаю с очень большими файлами секвенсирования и работает в течение дня и не добился большого прогресса. Поэтому я ищу любые предложения, чтобы сделать это намного быстрее, если это возможно. Благодарю.

def method(): 
    target = open(output_file, 'w') 

    with open(input_file, 'r') as f: 
     lineCharsList = [] 

     for line in f: 
      #Make string from first and last 6 characters of a line 
      lineChars = line[0:6]+line[145:151] 

      if not (lineChars in lineCharsList): 
       lineCharsList.append(lineChars) 

       target.write(lineChars + '\n') #If string is unique, write to output file 

      for skip in range(3): #Used to step through four lines at a time 
       try: 
        check = line #Check for additional lines in file 
        next(f) 
       except StopIteration: 
        break 
    target.close() 
+0

Я предполагаю, что проблема заключается в том, что когда-то линияCharsList становится большой, сценарий будет очень медленным. У меня нет никаких предложений, но это, вероятно, проблема. – Loocid

+0

Вот что я тоже думаю. ОЗУ не должно быть проблемой, поскольку я работаю над вычислительным кластером с большим запасом. Но я не уверен, что есть лучший способ сделать это, чем просто хранить все в списке, подобном этому. –

+1

В качестве стороннего варианта вы можете включить выходной файл в '' 'with'''' '' 'с открытым (input_file, 'r') как f, open (output_file, 'w') в качестве цели:' ' '. – wwii

ответ

6

Попробуйте определения lineCharsList как set вместо списка:

lineCharsList = set() 
... 
lineCharsList.add(lineChars) 

Это будет улучшить производительность оператора in. Кроме того, если память не является проблемой вообще, вам может понадобиться скопировать весь вывод в список и записать все в конце, вместо выполнения нескольких операций write().

2

Помимо использования set, как предложил Оскар, вы можете также использовать islice пропустить линии, а не использовать для цикла.

Как указано в this post, islice препроцессор итератора в C, поэтому он должен быть намного быстрее, чем использовать простой ванильный питон для цикла.

1

Попробуйте заменить

lineChars = line[0:6]+line[145:151]

с

lineChars = ''.join([line[0:6], line[145:151]])

, как это может быть более эффективным, в зависимости от обстоятельств.

Смежные вопросы