Каков наиболее эффективный способ сопоставления элементов списка с строками в большом файле в Python?

У меня есть большой файл (5Gb), называемый my_file . У меня есть список, называемый my_list . Каков наиболее эффективный способ чтения каждой строки в файле, и если элемент из my_list соответствует элементу из строки в my_file , создайте новый список со списком matches который содержит элементы из строк в my_file И элементы из my_list где совпадение произошло. Вот что я пытаюсь сделать:

 def calc(my_file, my_list) matches = [] my_file.seek(0,0) for i in my_file: i = list(i.rstrip('\n').split('\t')) for v in my_list: if v[1] == i[2]: item = v[0], i[1], i[3] matches.append(item) return matches 

вот несколько строк в my_file :

 lion 4 blue ch3 sheep 1 red pq2 frog 9 green xd7 donkey 2 aqua zr8 

вот несколько элементов в my_list

 intel yellow amd green msi aqua 

Желаемый результат, список списков в приведенном выше примере:

 [['amd', 9, 'xd7'], ['msi', 2, 'zr8']] 

Мой код в настоящее время работает, хотя и очень медленный. Будет ли использовать генератор или сериализацию? Благодарю.

4 Solutions collect form web for “Каков наиболее эффективный способ сопоставления элементов списка с строками в большом файле в Python?”

Вы могли бы построить диктатор для поиска v. Я добавил дополнительные небольшие оптимизации:

 def calc(my_file, my_list) vd = dict( (v[1],v[0]) for v in my_list) my_file.seek(0,0) for line in my_file: f0, f1, f2, f3 = line[:-1].split('\t') v0 = vd.get(f2) if v0 is not None: yield (v0, f1, f3) 

Это должно быть намного быстрее для большого my_list .

Использование get выполняется быстрее, чем проверка того, является ли i[2] в vd + доступ vd[i[2]]

Для получения большего ускорения за пределами этих оптимизаций я рекомендую http://www.cython.org

Храните предметы в списке, а не в списке (назовем его items ). Теперь перебирайте файл, как вы делаете, и выбираете ключ для поиска ( i[2] ), а затем проверяете, есть ли он в items .

предметы были бы.

 dict (yellow = "intel", green = "amd", aqua = "msi") 

Таким образом, контрольная часть будет.

 if i[2] in items: yield [[items[i[2]], i[1], i[3]] 

Поскольку вы просто создаете список и возвращаете его, использование генератора может помочь характеристикам памяти программы, а не помещать все это в список и возвращать его.

Не так много можно сделать с накладными расходами на чтение файла, но на основе кода вашего примера вы можете ускорить сопоставление, сохранив свой список как dict (с целевым полем в качестве ключа).

Вот пример, с несколькими дополнительными улучшениями:

 mylist = { "yellow" : "intel", "green" : "amd", # .... } matches = [] for line in my_file: i = line[:-1].split("\t") try: # faster to ask for forgiveness than permission matches.append([mylist[i[2]], i[1], i[3]]) except NameError: pass 

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

Вот вариант ответа @ rocksportrocker с использованием модуля csv :

 import csv def calc_csv(lines, lst): d = dict((v[1], v[0]) for v in lst) # use dict to speed up membership test return ((d[f2], f1, f3) for _, f1, f2, f3 in csv.reader(lines, dialect='excel-tab') if f2 in d) # assume that intersection is much less than the file 

Пример:

 def test(): my_file = """\ lion 4 blue ch3 sheep 1 red pq2 frog 9 green xd7 donkey 2 aqua zr8 """.splitlines() my_list = [ ("intel", "yellow"), ("amd", "green"), ("msi", "aqua"), ] res = list(calc_csv(my_file, my_list)) assert [('amd', '9', 'xd7'), ('msi', '2', 'zr8')] == res if __name__=="__main__": test() 
  • сортировка списка списков и получение индексов в несортированном списке
  • Python - значения суммы в словаре
  • Как превратить список в вложенный dict в Python
  • Печать СПИСОК символов unicode без символов escape
  • Как я могу умножить все элементы в списке вместе с Python?
  • Найдите пересечение двух списков?
  • Создана таблица из списка, не отображающая все элементы
  • Как изменить список с помощью рекурсии в Python?
  • Python - лучший язык программирования в мире.