1

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

我尝试使用deepcopyand 以将原始字典用作更新的“基础”。结果证明,复制比从头开始重建整个字典要慢一个数量级。

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

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)

结果:13.8005886255 秒

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

4

1 回答 1

1

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

newdict = {k, v[:] for k, v in olddict.iteritems()}
于 2012-12-03T15:35:54.720 回答