У меня есть длинный (много миллионов) список транзакций в форме [account_id, transactiontyp, data], у каждой учетной записи много Сделок. Я хочу выбрать все транзакции для данного короткого списка (около 20000) учетных записей. Пример:python select sublist эффективно
longlist=[['a','t1',5],['a','t1',9],['b','t1',3],['c','t5',8]]
shortlist=['a','c']
Следующий код делает трюк, но экстремально медленно:
selection=[sel for sel in longlist if sel[0] in shortlist]
Там должны быть более быстрые способы для достижения этой цели? Я попробовал
def select_sample(longlist,shortlist):
ret=[]
for elem in longlist:
if elem[0] in shortlist:
ret.append(elem)
return ret
посмотреть, как он масштабируется, как и ожидалось, он линейный по размеру длинного списка. Longlist сортируется по account_id. У меня нет уникального ключа в длинном списке, чтобы использовать словари. Есть ли что-то вроде индексной техники, которую я мог бы использовать?
Вы можете использовать двоичный поиск для отдельных учетных записей [см. Документацию] (https://docs.python.org/2/library/bisect.html#searching-sorted-lists), но затем вам необходимо выполнить это для каждой учетной записи , Я думаю, что должно существовать нечто лучшее. – syntonym
вы можете попробовать с генераторами –
Не совсем полное решение, но подумайте об использовании 'set' вместо списка для проверки:' shortset = set (shortlist) 'и' sel [0] в shortset'. –