對於這個特定的情況下,使用一個collections.Counter()
或collections.defaultdict()
對象,而不是:
import collections
dct = collections.defaultdict(int)
for c in string:
dict[c] += 1
或
dct = collections.Counter(string)
兩者都是標準dict
子類類型。 Counter
類型添加了一些更有用的功能,如總結兩個計數器或列出已計數的最常見實體。 defaultdict
類也可以被賦予其他默認類型;例如,使用defaultdict(list)
將事物收集到每個鍵的列表中。
如果要比較的兩種不同方法的性能,你要使用的timeit
module:
>>> import timeit
>>> def intest(dct, values):
... for c in values:
... if c in dct:
... dct[c]+=1
... else:
... dct[c]=1
...
>>> def get(dct, values):
... for c in values:
... dct[c] = dct.get(c, 0) + 1
...
>>> values = range(10) * 10
>>> timeit.timeit('test(dct, values)', 'from __main__ import values, intest as test; dct={}')
22.210275888442993
>>> timeit.timeit('test(dct, values)', 'from __main__ import values, get as test; dct={}')
27.442166090011597
這表明,使用in
快一點。
然而,有一個第三選項來考慮;捕捉KeyError
例外:
>>> def tryexcept(dct, values):
... for c in values:
... try:
... dct[c] += 1
... except KeyError:
... dct[c] = 1
...
>>> timeit.timeit('test(dct, values)', 'from __main__ import values, tryexcept as test; dct={}')
18.023509979248047
這恰好是最快的,因爲只有1 10例是一個新的密鑰。
最後但並非最不重要的,這兩種選擇我建議:
>>> def default(dct, values):
... for c in values:
... dct[c] += 1
...
>>> timeit.timeit('test(dct, values)', 'from __main__ import values, default as test; from collections import defaultdict; dct=defaultdict(int)')
15.277361154556274
>>> timeit.timeit('Counter(values)', 'from __main__ import values; from collections import Counter')
38.657804012298584
所以Counter()
類型是最慢的,但defaultdict
是非常快確實如此。 Counter()
雖然做了很多工作,並且額外的功能可以在其他地方爲開發和執行速度帶來便利。
要計算鍵,請使用'collections.Counter'對象。 –
您也可以在這裏使用'collections.defaultdict(int)'。 –