我正在为一个性能很重要的应用程序编写代码。我想知道为什么defaultdictsetdefault更快。
我希望能够使用setdefault,主要是因为我不喜欢嵌套的defaultdict的打印输出(请参见下面的实现)。
在我的代码中,我需要测试element_id是否已经是dict的键。
以下是我正在测试的两个功能:

def defaultdictfunc(subcases,other_ids,element_ids):
    dict_name= defaultdict(lambda: defaultdict(lambda: defaultdict(dict)))
    for subcase in subcases:
        for other_id in other_ids:
            for element_id in element_ids:
                if element_id in dict_name[subcase][other_id]:
                    # error duplicate element_id
                    pass
                else:
                    dict_name[subcase][other_id][element_id]=0
    return dict_name

def setdefaultfunc(subcases,other_ids,element_ids):
    dict_name={}
    for subcase in subcases:
        for other_id in other_ids:
            for element_id in element_ids:
                if element_id in dict_name.setdefault(subcase,{}).setdefault(other_id,{}):
                    # error duplicate element_id
                    pass
                else:
                    dict_name[subcase][other_id][element_id]=0

    return dict_name

IPython输入和输出:
In [1]: from numpy.random import randint

In [2]: subcases,other_ids,element_ids=(randint(0,100,100),randint(0,100,100),randint(0,100,100))

In [5]: from collections import defaultdict

In [6]: defaultdictfunc(subcases,other_ids,element_ids)==setdefaultfunc(subcases,other_ids,element_ids)
Out[6]: True

In [7]: %timeit defaultdictfunc(subcases,other_ids,element_ids)
10 loops, best of 3: 177 ms per loop

In [8]: % timeit setdefaultfunc(subcases,other_ids,element_ids)
1 loops, best of 3: 351 ms per loop

为什么setdefaultfunc较慢。我认为底层代码是相同的。有没有办法提高它的速度?
谢谢

最佳答案

根据用户aneroid
有意义的是,defaultdictdict.setdefault()更快,因为前者在创建时为整个dict设置默认值,而setdefault()在读取时为每个元素设置默认值。使用setdefault的一个原因是,当您分配的默认值是基于键(或其他东西)而不是整个dict的通用默认值时。

08-28 05:36