Python:“ KeyError除外”是否比“ if key in dict”快?

Python:“ KeyError除外”是否比“ if key in dict”快?,第1张

Python:“ KeyError除外”是否比“ if key in dict”快?

您的主张 绝对错误 取决于输入。

如果您有各种各样的键组,并且

except
经常击中该键区,那么性能将不佳。如果该
try
块占主导地位,则该
try/except
成语可以在较小的列表上执行。

这是一个基准,显示了执行相同 *** 作的几种方法

from __future__ import print_functionimport timeitimport randomimport collectionsdef f1():    d={}    for x in tgt:        if x in d: d[x]+=1        else: d[x]=1    return ddef f2():    d = {}    for x in tgt:        try: d[x]+=1        except KeyError: d[x] = 1        return ddef f3():    d={}.fromkeys(tgt, 0)    for x in tgt:        d[x]+=1        return ddef f4():    d=collections.defaultdict(int)    for x in tgt:        d[x]+=1        return ddef f5():    return collections.Counter(tgt)def f6():    d={}    for x in tgt:        d[x]=d.setdefault(x, 0)+1    return ddef f7():    d={}    for x in tgt:        d[x]=d.get(x,0)+1    return ddef cmpthese(funcs, c=10000, rate=True, micro=False):    """Generate a Perl style function benchmark""" def pprint_table(table):        """Perl style table output"""        def format_field(field, fmt='{:,.0f}'): if type(field) is str: return field if type(field) is tuple: return field[1].format(field[0]) return fmt.format(field)        def get_max_col_w(table, index): return max([len(format_field(row[index])) for row in table])        col_paddings=[get_max_col_w(table, i) for i in range(len(table[0]))]        for i,row in enumerate(table): # left col row_tab=[row[0].ljust(col_paddings[0])] # rest of the cols row_tab+=[format_field(row[j]).rjust(col_paddings[j]) for j in range(1,len(row))] print(' '.join(row_tab))    results={k.__name__:timeit.Timer(k).timeit(c) for k in funcs}    fastest=sorted(results,key=results.get, reverse=True)    table=[['']]    if rate: table[0].append('rate/sec')    if micro: table[0].append('usec/pass')    table[0].extend(fastest)    for e in fastest:        tmp=[e]        if rate: tmp.append('{:,}'.format(int(round(float(c)/results[e]))))        if micro: tmp.append('{:.3f}'.format(1000000*results[e]/float(c)))        for x in fastest: if x==e: tmp.append('--') else: tmp.append('{:.1%}'.format((results[x]-results[e])/results[e]))        table.append(tmp)    pprint_table(table)if __name__=='__main__':    import sys    print(sys.version)    for j in [100,1000]:        for t in [(0,5), (0,50), (0,500)]: tgt=[random.randint(*t) for i in range(j)] print('{} rand ints between {}:'.format(j,t)) print('=====') cmpthese([f1,f2,f3,f4,f5,f6,f7]) print()

我包括一个小的基准函数,基于

timeit
该函数打印从最慢到最快的函数,并且它们之间有百分比差异。

这是Python 3的结果:

3.4.1 (default, May 19 2014, 13:10:29) [GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)]100 rand ints between (0, 5):=====   rate/sec    f6    f7     f1     f2     f3     f4     f5f6   52,756    -- -1.6% -26.2% -27.9% -30.7% -36.7% -46.8%f7   53,624  1.6%    -- -25.0% -26.7% -29.6% -35.7% -46.0%f1   71,491 35.5% 33.3%     --  -2.3%  -6.1% -14.2% -28.0%f2   73,164 38.7% 36.4%   2.3%     --  -3.9% -12.2% -26.3%f3   76,148 44.3% 42.0%   6.5%   4.1%     --  -8.7% -23.3%f4   83,368 58.0% 55.5%  16.6%  13.9%   9.5%     -- -16.0%f5   99,247 88.1% 85.1%  38.8%  35.6%  30.3%  19.0%     --100 rand ints between (0, 50):=====   rate/sec     f2     f6     f7     f4     f3     f1     f5f2   39,405     -- -17.9% -18.7% -19.1% -41.8% -47.8% -56.3%f6   47,980  21.8%     --  -1.1%  -1.6% -29.1% -36.5% -46.8%f7   48,491  23.1%   1.1%     --  -0.5% -28.4% -35.8% -46.2%f4   48,737  23.7%   1.6%   0.5%     -- -28.0% -35.5% -46.0%f3   67,678  71.7%  41.1%  39.6%  38.9%     -- -10.4% -24.9%f1   75,511  91.6%  57.4%  55.7%  54.9%  11.6%     -- -16.3%f5   90,175 128.8%  87.9%  86.0%  85.0%  33.2%  19.4%     --100 rand ints between (0, 500):=====   rate/sec     f2     f4     f6     f7     f3     f1     f5f2   25,748     -- -22.0% -41.4% -42.6% -57.5% -66.2% -67.8%f4   32,996  28.1%     -- -24.9% -26.4% -45.6% -56.7% -58.8%f6   43,930  70.6%  33.1%     --  -2.0% -27.5% -42.4% -45.1%f7   44,823  74.1%  35.8%   2.0%     -- -26.1% -41.2% -44.0%f3   60,624 135.5%  83.7%  38.0%  35.3%     -- -20.5% -24.2%f1   76,244 196.1% 131.1%  73.6%  70.1%  25.8%     --  -4.7%f5   80,026 210.8% 142.5%  82.2%  78.5%  32.0%   5.0%     --1000 rand ints between (0, 5):=====   rate/sec     f7     f6     f1     f3     f2     f4     f5f7    4,993     --  -6.7% -34.6% -39.4% -44.4% -50.1% -71.1%f6    5,353   7.2%     -- -29.9% -35.0% -40.4% -46.5% -69.0%f1    7,640  53.0%  42.7%     --  -7.3% -14.9% -23.6% -55.8%f3    8,242  65.1%  54.0%   7.9%     --  -8.2% -17.6% -52.3%f2    8,982  79.9%  67.8%  17.6%   9.0%     -- -10.2% -48.1%f4   10,004 100.4%  86.9%  30.9%  21.4%  11.4%     -- -42.1%f5   17,293 246.4% 223.0% 126.3% 109.8%  92.5%  72.9%     --1000 rand ints between (0, 50):=====   rate/sec     f7     f6     f1     f2     f3     f4     f5f7    5,051     --  -7.1% -26.5% -29.0% -34.1% -45.7% -71.2%f6    5,435   7.6%     -- -20.9% -23.6% -29.1% -41.5% -69.0%f1    6,873  36.1%  26.5%     --  -3.4% -10.3% -26.1% -60.8%f2    7,118  40.9%  31.0%   3.6%     --  -7.1% -23.4% -59.4%f3    7,661  51.7%  41.0%  11.5%   7.6%     -- -17.6% -56.3%f4    9,297  84.0%  71.1%  35.3%  30.6%  21.3%     -- -47.0%f5   17,531 247.1% 222.6% 155.1% 146.3% 128.8%  88.6%     --1000 rand ints between (0, 500):=====   rate/sec     f2     f4     f6     f7     f3     f1     f5f2    3,985     -- -11.0% -13.6% -14.8% -25.7% -40.4% -66.9%f4    4,479  12.4%     --  -2.9%  -4.3% -16.5% -33.0% -62.8%f6    4,613  15.8%   3.0%     --  -1.4% -14.0% -31.0% -61.6%f7    4,680  17.4%   4.5%   1.4%     -- -12.7% -30.0% -61.1%f3    5,361  34.5%  19.7%  16.2%  14.6%     -- -19.8% -55.4%f1    6,683  67.7%  49.2%  44.9%  42.8%  24.6%     -- -44.4%f5   12,028 201.8% 168.6% 160.7% 157.0% 124.3%  80.0%     --

和Python 2:

2.7.6 (default, Dec  1 2013, 13:26:15) [GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.2.79)]100 rand ints between (0, 5):=====   rate/sec     f5     f7     f6     f2     f1     f3     f4f5   24,955     -- -41.8% -42.5% -51.3% -55.7% -61.6% -65.2%f7   42,867  71.8%     --  -1.2% -16.4% -23.9% -34.0% -40.2%f6   43,382  73.8%   1.2%     -- -15.4% -23.0% -33.2% -39.5%f2   51,293 105.5%  19.7%  18.2%     --  -9.0% -21.0% -28.5%f1   56,357 125.8%  31.5%  29.9%   9.9%     -- -13.2% -21.4%f3   64,924 160.2%  51.5%  49.7%  26.6%  15.2%     --  -9.5%f4   71,709 187.3%  67.3%  65.3%  39.8%  27.2%  10.5%     --100 rand ints between (0, 50):=====   rate/sec     f2     f5     f7     f6     f4     f3     f1f2   22,439     --  -4.7% -45.1% -45.5% -50.7% -63.3% -64.5%f5   23,553   5.0%     -- -42.4% -42.8% -48.3% -61.5% -62.8%f7   40,878  82.2%  73.6%     --  -0.7% -10.2% -33.2% -35.4%f6   41,164  83.4%  74.8%   0.7%     --  -9.6% -32.7% -34.9%f4   45,525 102.9%  93.3%  11.4%  10.6%     -- -25.6% -28.0%f3   61,167 172.6% 159.7%  49.6%  48.6%  34.4%     --  -3.3%f1   63,261 181.9% 168.6%  54.8%  53.7%  39.0%   3.4%     --100 rand ints between (0, 500):=====   rate/sec     f2     f5     f4     f6     f7     f3     f1f2   13,122     -- -39.9% -56.2% -63.2% -63.8% -75.8% -80.0%f5   21,837  66.4%     -- -27.1% -38.7% -39.8% -59.6% -66.7%f4   29,945 128.2%  37.1%     -- -16.0% -17.4% -44.7% -54.3%f6   35,633 171.6%  63.2%  19.0%     --  -1.7% -34.2% -45.7%f7   36,257 176.3%  66.0%  21.1%   1.8%     -- -33.0% -44.7%f3   54,113 312.4% 147.8%  80.7%  51.9%  49.2%     -- -17.5%f1   65,570 399.7% 200.3% 119.0%  84.0%  80.8%  21.2%     --1000 rand ints between (0, 5):=====   rate/sec     f5     f7     f6     f1     f2     f3     f4f5    2,787     -- -37.7% -38.4% -53.3% -59.9% -60.4% -67.0%f7    4,477  60.6%     --  -1.1% -25.0% -35.6% -36.3% -47.0%f6    4,524  62.3%   1.1%     -- -24.2% -34.9% -35.6% -46.5%f1    5,972 114.3%  33.4%  32.0%     -- -14.1% -15.0% -29.3%f2    6,953 149.5%  55.3%  53.7%  16.4%     --  -1.1% -17.7%f3    7,030 152.2%  57.0%  55.4%  17.7%   1.1%     -- -16.8%f4    8,452 203.3%  88.8%  86.8%  41.5%  21.6%  20.2%     --1000 rand ints between (0, 50):=====   rate/sec     f5     f7     f6     f2     f1     f3     f4f5    2,667     -- -37.8% -38.7% -53.0% -55.9% -61.1% -65.3%f7    4,286  60.7%     --  -1.5% -24.5% -29.1% -37.5% -44.2%f6    4,351  63.1%   1.5%     -- -23.4% -28.0% -36.6% -43.4%f2    5,677 112.8%  32.4%  30.5%     --  -6.1% -17.3% -26.1%f1    6,045 126.6%  41.0%  39.0%   6.5%     -- -11.9% -21.4%f3    6,862 157.3%  60.1%  57.7%  20.9%  13.5%     -- -10.7%f4    7,687 188.2%  79.3%  76.7%  35.4%  27.2%  12.0%     --1000 rand ints between (0, 500):=====   rate/sec     f2     f5     f7     f6     f4     f3     f1f2    2,018     -- -16.1% -44.1% -46.2% -53.4% -61.8% -63.0%f5    2,405  19.1%     -- -33.4% -35.9% -44.5% -54.4% -55.9%f7    3,609  78.8%  50.1%     --  -3.8% -16.7% -31.6% -33.8%f6    3,753  85.9%  56.1%   4.0%     -- -13.4% -28.9% -31.2%f4    4,334 114.7%  80.2%  20.1%  15.5%     -- -17.9% -20.5%f3    5,277 161.5% 119.5%  46.2%  40.6%  21.8%     --  -3.2%f1    5,454 170.2% 126.8%  51.1%  45.3%  25.8%   3.3%     --

所以-这取决于。

结论:

  1. Counter
    方法几乎总是最慢的
  2. Counter
    方法是Python 2上最慢的方法,但到目前为止是Python 3.4上最快的方法之一
  3. try/except
    版本 通常 是最慢的
  4. if key in dict
    无论大小或键数如何,该版本都是最佳/最快的版本之一
  5. {}.fromkeys(tgt, 0)
    是非常可预测的
  6. defaultdict
    版本在较大列表中最快。列表越小,设置时间越长,分摊的元素越少。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5630168.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存