Рассмотрим большой список именованных элементов (первая строка), возвращаемых из большого CSV-файла (80 МБ) с возможным интервалом прерывания
name_line = ['a',,'b',,'c' .... ,,'cb','cc']
Я читаю оставшиеся данные построчно, и мне нужно только обрабатывать данные с соответствующим именем. Данные могут выглядеть как
data_line = ['10',,'.5',,'10289' .... ,,'16.7','0']
Я пробовал это двумя способами. Один выводит пустые столбцы из каждой строки прочитанного
blnk_cols = [1,3, ... ,97]
while data:
...
for index in blnk_cols: data_line.pop(index)
другой компилирует элементы, связанные с именем из L1
good_cols = [0,2,4, ... ,98,99]
while data:
...
data_line = [data_line[index] for index in good_cols]
в данных, которые я использую, определенно будет больше хороших линий, чем плохих, хотя может быть и половина и половина.
Я использовал пакеты cProfile и pstats, чтобы определить мои самые слабые ссылки в скорости, что показало, что pop был текущим медленным элементом. Я переключился на список comp и время почти удвоилось.
Я предполагаю, что одним быстрым способом было бы нарезать массив, получая только хорошие данные, но это было бы сложно для файлов с чередующимися пустыми и хорошими данными.
что мне действительно нужно, так это уметь
data_line = data_line[good_cols]
эффективно передавая список индексов в список, чтобы вернуть эти элементы.
Прямо сейчас моя программа работает примерно за 2,3 секунды для файла размером 10 МБ, а всплывающее окно занимает около 0,3 секунды.
Существует ли более быстрый способ доступа к определенным местам в списке. В Си это будет просто разыменование массива указателей на правильные индексы в массиве.
Дополнения:
name_line в файле перед прочтением
a,b,c,d,e,f,g,,,,,h,i,j,k,,,,l,m,n,
name_line после прочтения и разделения (",")
['a','b','c','d','e','f','g','','','','','h','i','j','k','','','','l','m','n','\n']