使用infinite_defaultdict的价格

时间:2014-03-27 07:27:17

标签: python recursion dictionary

这对我来说是一个天堂:

>>> from collections import defaultdict
>>> infinite_defaultdict = lambda: defaultdict(infinite_defaultdict)
>>> d = infinite_defaultdict() 
>>> d['x']['y']['z'] = 10

Raymond Hettinger on Twitter

有了这个我不明白为什么我们应该再这样做了:

mydict = defaultdict(list)
mydict = defaultdict(lambda: defaultdict(float))

等...

但我可能错了。 您是否希望避免使用infinite_defaultdict

更新 我试着对时间进行基准测试

from collections import defaultdict

def infdd():
   infinite_defaultdict = lambda: defaultdict(infinite_defaultdict)
   idd = infinite_defaultdict()
   idd['x'] = [1,2,3]

def plaindd():
   ddl  = defaultdict(list)
   ddl['x'] = [1,2,3]

if __name__ == '__main__':
    import timeit
    print "Infd = %.3f" % (timeit.timeit("infdd()",setup="from __main__ import infdd"))
    print "Plaind = %.3f" % (timeit.timeit("plaindd()",setup="from __main__ import plaindd"))

显然,infinite_dict几乎是正常速度的两倍:

Infd = 0.632
Paind = 0.387

1 个答案:

答案 0 :(得分:1)

如果您需要默认值为dict以外的其他值,则不应使用infinite_defaultdict。例如,如果要计算项目或累积项目数组,则需要将默认值设为数字或数组。

def group_by(key, items):
    result = defaultdict(list)
    for item in items:
        result[key(item)].append(item)
    return result

group_by(len, ['here', 'are', 'some', 'words'])
# -> { 3: ['are'] 4: ['here', 'some'], 5: ['words'] }