2016-08-10 5 views
2

У меня есть следующий список dicts.Самый эффективный способ поиска в списке dicts

people = [ 
{'name': "Tom", 'age': 10}, 
{'name': "Mark", 'age': 5}, 
{'name': "Pam", 'age': 7} 
] 

Какой был бы наиболее оптимизированный способ с точки зрения производительности для поиска в списке dicts. Ниже приведены некоторые методы различны:

next((item for item in dicts if item["name"] == "Pam"), None) 

ИЛИ

filter(lambda person: person['name'] == 'Pam', people) 

ИЛИ

def search(name): 
    for p in people: 
     if p['name'] == name: 
      return p 

ИЛИ

def search_dictionaries(key, value, list_of_dictionaries): 
    return [element for element in list_of_dictionaries if element[key] == value] 

Любой другой метод также приветствуется. Благодарю.

+0

Вы делаете это один раз и все? Если это так, а возвращение, как только вы нашли, предмет имеет наибольший смысл. Если нет, используйте сопоставление, которое можно повторно использовать для последующих поисков. –

ответ

0

Если вы ищете для одного элемента, то это «лучший» подход

def search(name): 
    for p in people: 
     if p['name'] == name: 
      return p 

Все остальные реализации будут перебрать все элементы в списке, в то время как это один остановится, как только деталь найдено

7

Doing быстро timeit на функции показывают, что с помощью фильтра, кажется, самый быстрый из всех методов

%timeit filter(lambda person: person['name'] == 'Pam', people)

+1000000 петли, лучшие из 3: 263 нс на петле

  • Использование следующего производит время 731ns
  • Использование метода поиска производит время 361ns
  • И, наконец, seach_dictionaries использует 811ns