代码之家  ›  专栏  ›  技术社区  ›  HardQuestions

在Python中从dict中删除某些键的最快方法

  •  7
  • HardQuestions  · 技术社区  · 15 年前

    这里有一些选择

    for k in somedict.keys(): 
        if k.startswith("someprefix"): 
            del somedict[k]
    

    dict((k, v) for (k, v) in somedict.iteritems() if not k.startswith('someprefix'))
    

    再快点吗?

    2 回复  |  直到 10 年前
        1
  •  9
  •   Ignacio Vazquez-Abrams    15 年前

    如果dict足够大,那么生成一个全新的dict是有意义的。

    dict((k, v) for (k, v) in somedict.iteritems() if not k.startswith('someprefix'))
    
        2
  •  16
  •   mechanical_meat nazca    15 年前

    不仅是 del pop() :

    $ python -m timeit -s "d = {'f':1,'foo':2,'bar':3}" "for k in d.keys():" "  if k.startswith('f'):" "    del d[k]"
    1000000 loops, best of 3: 0.733 usec per loop
    
    $ python -m timeit -s "d = {'f':1,'foo':2,'bar':3}" "for k in d.keys():" "  if k.startswith('f'):" "    d.pop(k)"
    1000000 loops, best of 3: 0.742 usec per loop
    

    $ python -m timeit -s "d = {'f':1,'foo':2,'bar':3}" "d1 = d.copy()"
    1000000 loops, best of 3: 0.278 usec per loop
    

    基于复制dict的基准:

    $ python -m timeit -s "d = {'f':1,'foo':2,'bar':3}" "d1 = d.copy()" "for k in d1.keys():" "  if k.startswith('f'):" "    del d1[k]"
    100000 loops, best of 3: 1.95 usec per loop
    
    $ python -m timeit -s "d = {'f':1,'foo':2,'bar':3}" "d1 = d.copy()" "for k in d1.keys():" "  if k.startswith('f'):" "    d1.pop(k)"
    100000 loops, best of 3: 2.15 usec per loop
    

    减去复制成本,我们得到1.872 usec pop() 和1.672 德尔 .