拼合字典和嵌套字典之间的速度性能差异

时间:2019-04-24 20:38:40

标签: python python-3.x performance dictionary

我用python开发了一个程序,用扁平的字典组织数据。 随着dict大小的增加,由于密集的键搜索,程序变得更慢。 在我看来,嵌套字典结构似乎是一种“分层”方法,可以加快键的搜索速度。 我错了吗?

是嵌套字典吗?

nested_dict = { 'dictA': {'key_1': 'value_1', 'key_2': 'value_2'},
                'dictB': {'key_3': 'value_3', 'key_4': 'value_4', 'key_5': 'value_5'},
                ...
                'dictZ': {'key_m': 'value_m', 'key_n': 'value_n'}}

比扁平化的字典快:

dictionary = {'key_1': 'value_1',
              'key_2': 'value_2',
              ...
              'key_n': 'value_n'}

编辑:添加了一些代码示例

下面我通常使用的一段代码。该程序很大,因此没有要评估的特定代码

任务:

dictionary['key_1'] = dictionary2['key_a']
dictionary['key_3'] = dictionary2['key_a']*dictionary['key_4']

有条件的声明:

if( (0 == dictionary['key_1']) and
    (dictionary2['key_b'] >= dictionary['key_3']) ):

2 个答案:

答案 0 :(得分:2)

  

在我看来,嵌套字典结构是一个   “分层”方法可以加快密钥的搜索。我是吗   错误吗?

是:-)

平面dict空间具有O(1)查找,与大小无关。这就是哈希表作为数据结构如此吸引人的原因。

添加层次结构只会添加额外的哈希步骤和查找步骤。

在某些情况下,容器确实可以通过变小而获得一些缓存局部性的好处,但是在Python中,容器引用的对象分散在整个内存中,因此紧凑性无济于事。

此外,Python是一种解释型语言,因此添加额外的查找层还需要进行更多的操作码评估。这将淹没任何紧凑的好处。

答案 1 :(得分:0)

平面词典比嵌套词典更快。为了补充此答案,这是我构建字典的方式。

如果数据的结构方式可以通过组合键(复合键)识别一个值,请使用元组作为字典键。

companies = {}
companies[('Canada', 'ABC')] = 'Association des Bucherons du Canada'
companies[('Usa', 'ABC')] = 'American Broadcasting Company'
companies[('Usa', 'AAPL')] = 'Apple'

>>> companies.keys()
dict_keys([('Canada', 'ABC'), ('Usa', 'ABC'), ('Usa', 'AAPL')])

您的字典将平整而快速。