Python: Collections.Counter против defaultdict(int)
Допустим, у меня есть данные, которые выглядят следующим образом:
Lucy = 1
Bob = 5
Jim = 40
Susan = 6
Lucy = 2
Bob = 30
Harold = 6
Я хочу выполнить следующие действия:
- Удалить дублирующиеся ключи.
- Сложить значения для этих дублирующихся ключей.
Это означает, что в результате я хочу получить такие пары ключ/значение:
Lucy = 3
Bob = 35
Jim = 40
Susan = 6
Harold = 6
Какой из методов будет лучше использовать для решения этой задачи: Counter
или defaultdict
из модуля collections
?
2 ответ(ов)
В вашем коде вы сравниваете производительность Counter
и defaultdict(int)
для подсчета количества элементов в диапазоне от 0 до 9999. Действительно, вы заметили, что использование defaultdict(int)
работает быстрее.
Это связано с тем, как эти структуры данных реализованы. Counter
- это специализированная подсистема для подсчета хешируемых объектов, но она немного более сложна в обработке, так как включает в себя дополнительные проверки и может поддерживать больше функций.
С другой стороны, defaultdict(int)
является простой или "легкой" версией словаря, которая автоматически инициализирует значения по умолчанию при первом доступе к ключу. Это означает, что при добавлении новых значений нет дополнительных затрат на создание подсчета как в случае с Counter
.
Ваши результаты с использованием %timeit
показывают, что test_defaultdict()
выполняется значительно быстрее (примерно 2.31 ms) по сравнению с test_counter()
(примерно 5.28 ms). Это хорошо подтверждает идею о том, что для простой задачи подсчета лучше использовать defaultdict(int)
, если вам не нужны специфические функции Counter
.
Надеюсь, это помогло понять, почему defaultdict(int)
эффективнее в вашем случае!
Я рекомендую использовать defaultdict(int)
для суммирования значений, как в вашем случае, и Counter()
для подсчета элементов списка. В вашем примере чистейшим решением будет следующее:
from collections import defaultdict
name_count = [
("Lucy", 1),
("Bob", 5),
("Jim", 40),
("Susan", 6),
("Lucy", 2),
("Bob", 30),
("Harold", 6)
]
aggregate_counts = defaultdict(int)
for name, count in name_count:
aggregate_counts[name] += count
Таким образом, вы получите общий подсчет для каждого имени.
Преобразование списка словарей в DataFrame pandas
Почему использовать dict.get(key) вместо dict[key]?
Как преобразовать вложенный словарь Python в объект?
Ошибка: "'dict' объект не имеет метода 'iteritems'"
Есть ли питоний способ объединить два словаря (сложив значения для ключей, которые присутствуют в обоих)?