Рассмотрим большой список именованных элементов (первая строка), возвращенный из большого файла 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, чтобы определить мои самые слабые звенья в скорости, которые предположили, что всплывающее сообщение было самым медленным элементом на данный момент. Я переключился на составление списков, и время почти удвоилось.
Я полагаю, что одним из быстрых способов было бы разрезать массив с получением только хороших данных, но это было бы сложно для файлов с чередованием пустых и хороших данных.
что мне действительно нужно, так это иметь возможность
data_line = data_line[good_cols]
эффективно передавать список индексов в список, чтобы вернуть эти элементы. Прямо сейчас моя программа работает примерно за 2,3 секунды для файла размером 10 МБ, а всплывающее окно составляет примерно 0,3 секунды.
Есть ли более быстрый способ получить доступ к определенным местоположениям в списке. В C это было бы просто разыменование массива указателей на правильные индексы в массиве.
Дополнения: 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']