0

Python: Collections.Counter против defaultdict(int)

80

Допустим, у меня есть данные, которые выглядят следующим образом:

Lucy = 1
Bob = 5
Jim = 40
Susan = 6
Lucy = 2
Bob = 30
Harold = 6

Я хочу выполнить следующие действия:

  1. Удалить дублирующиеся ключи.
  2. Сложить значения для этих дублирующихся ключей.

Это означает, что в результате я хочу получить такие пары ключ/значение:

Lucy = 3
Bob = 35
Jim = 40
Susan = 6
Harold = 6

Какой из методов будет лучше использовать для решения этой задачи: Counter или defaultdict из модуля collections?

2 ответ(ов)

0

В вашем коде вы сравниваете производительность 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) эффективнее в вашем случае!

0

Я рекомендую использовать 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

Таким образом, вы получите общий подсчет для каждого имени.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь