Python集合。Counter()运行时Python、Counter

2023-09-03 09:10:02 作者:那过去、早已淡忘ろ

我只是遇到了一个问题,我需要把一个列表,例如l=[1,2,3,4],放到一个DIC中,例如{1:1,2:1,3:1,4:1}。我只是想知道我是应该使用集合.Counter()还是自己编写一个循环来完成这项工作。内置方法比我自己写循环快吗?

推荐答案

您始终可以使用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倍。

Python中的collections.Counter模块

这就是说,除非您将代码的性能关键部分计算在内,否则请将重点放在可读性和可维护性上,在这方面,Counter()比编写您自己的代码更容易获胜。

除此之外,Counter()对象提供了字典之上的功能:它们可以被视为多集(您可以对计数器求和或减去,并产生并集或交集),并且它们可以有效地根据计数提供前N个元素。