2014-10-01 6 views
0

У меня есть огромный текстовый файл с целыми числами. Мне нужно обрабатывать их по строкам и сохранять их в отдельных списках на основе некоторых вычислений по номерам в каждой строке.Загрузка огромного текстового файла

Конечная цель - загрузить номера (кроме строки 1) в два списка - A = числа при нечетных позиции B = числа на четных позициях образца

файла:

1 3 4 5 
3 4 56 73 
3 4 5 6 

в настоящее время я делаю так:

with open(filename) as f: 
    for line in f: 
     line = line.split() 
     line_num = line_num + 1 
     if line_num == 1: 
      # do something 
      pass 
     if line_num > 1: 
      line = [int(i) for i in line] 
      for x in range(len(line)): 
       # do something 
       pass 

проблема заключается в том, что оно принимает много времени. Есть ли лучший способ сделать это быстро?

+3

Вы уверены, что это не ваша обработка, которая занимает много времени? Сколько времени требуется для запуска? Сколько времени потребуется, если вы прокомментируете свои расчеты? – Joe

+0

Мне нужно читать по очереди, чтобы обработать его. Если я удалю расчет, это займет меньше времени. Но как я могу улучшить производительность для чтения по строкам? –

+0

@NEW_PYTHON_LEARNER вы уже читаете файл по строкам: http://stackoverflow.com/questions/8009882/how-to-read-large-file-line-by-line-in-python –

ответ

0

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

with open(filename) as f: 
    line = next(f) 
    # do something for the first line 

    # handle rest lines 
    for line in f: 
     line = line.split() 
     line = [int(i) for i in line] 
     for field in line: 
      # do something with field 
      pass 

я удалил line_num, потому что нет никакого смысла в Orignal коде. Но если вам это нужно, использовать enumerate:

with open(filename) as f: 
    line = next(f) 

    for line_num, line in enumerate(f, 2): 
     ... 
+0

Как это улучшит производительность? – Andrey

+0

@ Андрей, он не улучшит производительность. Я хочу, чтобы OP знал, что проверка внутри цикла не нужна. – falsetru

1

Звучит как эффективный один для NumPy:

X = numpy.loadtxt(filename) #can specify if you know for sure all are integers 
odds = X[1::2] 
evens = X[::2] 
Смежные вопросы