2013-02-02 87 views
0

我剛開始學習python,並擔心如果我使用dict.get(key,default_value)或者我爲它定義自己的方法....所以他們有任何區別:dict.get()方法的效率

[第一方法]:

dict={} 
for c in string: 
    if c in dict: 
     dict[c]+=1 
    else: 
     dict[c]=1 

和其他dict.get()方法,Python提供

for c in string: 
    dict[c]=dict.get(c,0)+1 

做它們對效率或速度的任何差別...或者它們只是一樣,第二個只保存寫納克的代碼幾行...

+1

要計算鍵,請使用'collections.Counter'對象。 –

+1

您也可以在這裏使用'collections.defaultdict(int)'。 –

回答

6

對於這個特定的情況下,使用一個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()雖然做了很多工作,並且額外的功能可以在其他地方爲開發和執行速度帶來便利。

+0

非常好的功能,它是偏離過程......但同樣的問題......如果它只能節省很少/很多編碼,或者在其他方面更高效? 如果是,那麼其他哪些領域更有效? – adil

+1

@ user1977504:用'timeit'模塊自己測試一下。 :-) –

+0

好的,謝謝你的朋友 – adil