【问题标题】:Speed performance difference between flattened dictionary and nested dictionary扁平化字典和嵌套字典之间的速度性能差异
【发布时间】:2019-04-24 20:38:40
【问题描述】:

我用 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']) ):

【问题讨论】:

  • 您是如何搜索密钥的?如果您在巢中寻找钥匙,那么公寓会明显更快。
  • 你经常做哪些字典操作?添加新键、查找键等。您的字典有多大?数百、数千、数百万项?
  • 我正在使用以下语法搜索键:dictionary['key_1']。我在最大的字典中有大约 70 个键。
  • 请注意,在嵌套字典的情况下,您必须使用dictionary['dictA']['key1'] 格式进行搜索。您将如何使用键跟踪哪些父字典?维护嵌套结构的开销可能不值得。您的数据结构将取决于您如何使用它,在某些情况下,分层字典是有意义的,在某些情况下是扁平化的。
  • 70 个键对于人类来说是很大的概念,但对于计算机来说却很小。如果您遇到任何性能问题,这不是由于该 dict 的大小。在您的情况下,嵌套与扁平应该没有任何区别。

标签: python python-3.x performance dictionary


【解决方案1】:

查看嵌套字典结构,在我看来, “分层”方法可以加快键的搜索。我是不是 错了吗?

是的:-)

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

添加层次结构只是添加额外的散列步骤和查找步骤。

在某些情况下,容器确实通过体积小而获得了一些缓存局部性优势,但在 Python 中,容器具有对分散在内存中的对象的引用,因此紧凑性并没有多大帮助。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-04
    • 2018-11-09
    • 2011-08-27
    • 1970-01-01
    • 2015-06-10
    • 2019-03-02
    相关资源
    最近更新 更多