python - 如果数据冗余,重用预建字典的有效方法是什么?深拷贝太慢

标签 python performance optimization dictionary python-2.7

我有一个代码,涉及根据预先计算的数据(即进行多次查找)构建一个非常大的字典。它使用四整数元组作为键,使用元组列表作为项目。然后使用每个键的附加函数更新该字典(以便可以在稍后阶段对每个项目进行排序)。上述过程重复数千次,但原始(基础)字典保持不变。原始词典的大小与更新后的词典的大小大致相同(但有所不同)。

我尝试使用deepcopy并使用原始字典作为更新的“基础”。事实证明,复制比从头开始重建整个字典要慢一个数量级。

如果这还不清楚,也许这个简化的代码会更有意义:

print timeit.timeit('''
for iteration in xrange(10):
    base_dictionary = {(month, day, hour): [(value, 'some_data_name' + str(value)) for value in xrange(10)]
                      for month in xrange(5)
                      for day in xrange(5)
                      for hour in xrange(5)
                      }
    for valuenumber in xrange(10):
        for id_set in base_dictionary:
            base_dictionary[id_set].append((valuenumber, 'some_data_name' + str(valuenumber)))
'''
,
'''
''', number=100)

结果:1​​.30800844321 秒

print timeit.timeit('''
for iteration in xrange(10):
    new_dictionary = deepcopy(base_dictionary)
    for valuenumber in xrange(10):
        for id_set in new_dictionary:
            new_dictionary[id_set].append((valuenumber, 'some_data_name' + str(valuenumber)))
'''
,
'''
from copy import deepcopy
base_dictionary = {(month, day, hour): [(value, 'some_data_name' + str(value)) for value in xrange(10)]
                  for month in xrange(5)
                  for day in xrange(5)
                  for hour in xrange(5)
                  }
''', number=100)

结果:1​​3.8005886255 秒

每次运行迭代时都重建相同的字典感觉非常浪费。有没有办法加速这个过程?

最佳答案

您需要介于浅复制和深复制之间的东西。元组不需要复制,因为它们是不可变的。

newdict = {k, v[:] for k, v in olddict.iteritems()}

关于python - 如果数据冗余,重用预建字典的有效方法是什么?深拷贝太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13685445/

相关文章:

python - Foo.objects.get(id=None) 返回 Foo 实例,有时

python - 如何创建空列表列表

java - util 方法与在方法中编写相同代码之间的性能差异...?

android - 滚动基于 Cursor 的适配器的大列表比内存中适配器的小列表快得多

php - 如何以可扩展的方式执行多个 MySQL INSERT (PHP)

c++ - VS : unexpected optimization behavior with _BitScanReverse64 intrinsic

python - 具有固定集合约束的 Python 投资组合选择

python - 使用 Pandas 读取 Excel 文件时如何指定列名?

python - 幻方 python

python - python/cython 中绝对最快的查找