您始终可以使用timeit
模块测试是否更快。在Python3中,Counter
对象具有C语言性能改进,并且确实非常快:
>>> from timeit import timeit
>>> import random, string
>>> from collections import Counter, defaultdict
>>> def count_manually(it):
... res = defaultdict(int)
... for el in it:
... res[el] += 1
... return res
...
>>> test_data = [random.choice(string.printable) for _ in range(10000)]
>>> timeit('count_manually(test_data)', 'from __main__ import test_data, count_manually', number=2000)
1.4321454349992564
>>> timeit('Counter(test_data)', 'from __main__ import test_data, Counter', number=2000)
0.776072466003825
这里Counter()
快了2倍。
这就是说,除非您将代码的性能关键部分计算在内,否则请将重点放在可读性和可维护性上,在这方面,Counter()
比编写您自己的代码更容易获胜。
除此之外,Counter()
对象提供了字典之上的功能:它们可以被视为多集(您可以对计数器求和或减去,并产生并集或交集),并且它们可以有效地根据计数提供前N个元素。