Доступ к списку товаров со списком индексов - PullRequest
9 голосов
/ 25 января 2012

Рассмотрим большой список именованных элементов (первая строка), возвращаемых из большого 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']

1 Ответ

10 голосов
/ 25 января 2012

Попробуйте выражение генератора,

data_line = (data_line[i] for i in good_cols)

Также прочитайте здесь о Выражениях генератора и понимании списка

, поскольку верхний ответ говорит вам: «В основном, используйтевыражение-генератор, если все, что вы делаете, это итерация один раз '.

Так что вы должны извлечь из этого пользу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...