优化Python词典中的插入操作

时间:2015-07-19 08:00:48

标签: python dictionary

如果我们想要插入一个键的情况,只有在键不存在时才在我们的字典中输入值。 所以在C ++中我们写的就像

auto it = my_dictionary.insert( std::make_pair( key , value ) );

以后我们可以使用迭代器进行进一步的比较,比如

if ( it->second < something ) { /* do something */ }

如果我们必须在Python中实现相同,我们确实喜欢..

if key not in my_dictionary:
     my_dictionary[key] = value

每次比较或分配时,都必须进行查找。我们正在上面的代码段中执行两次搜索。我们怎样才能优化这个?

3 个答案:

答案 0 :(得分:1)

Python字典像哈希表一样工作。您所做的每个查询都是大致恒定的时间。在这种情况下,无需担心性能。

如果您真的想将一种迭代器保存到字典中,可以使用字典和列表。字典中的每个键都有一个列表元素的索引,这是一个带有单个元素的示例:

my_dictionary = dict(zip('key', 0))
actual_values = [value]

我们通过使用字典然后使用列表来获取对应的键值:

value = actual_values[my_dictionary['key']]

对于你要问的情况:

list_index = my_dictionary.get(key, None)
if list_index is not None:
    actual_values[list_index] = value

现在您只进行一次字典访问,另一种是列表索引。

告诉你这不值得担心。我计算了使用字典 1 时间然后使用字典 n 次与使用字典 n 次之间的时间差。这些是使用timeit表示具有40000键的字典的结果:

╔═════╦══════════════╦═════════════╗
║  n  ║ Direct Index ║ Array Index ║
╠═════╬══════════════╬═════════════╣
║ 1   ║ 1.913920 s   ║ 2.012300 s  ║
║ 2   ║ 2.214828 s   ║ 2.035465 s  ║
║ 10  ║ 2.932283 s   ║ 2.600727 s  ║
║ 100 ║ 9.425869 s   ║ 8.032046 s  ║
╚═════╩══════════════╩═════════════╝

如果您需要使用相同的密钥100次,您获得的性能提升约为17%!请注意,如果您只使用一次字典,那么解决方案(数组+字典)实际上会更糟糕,正如预期的那样。对于您提出的案例(n = 2),您的绩效收益仅为8%。

请记住,Python不是C或C ++。如果这对您来说是一个实际的性能问题,那么您就不应该使用Python。

答案 1 :(得分:0)

使用setdefault:

v = my_dictionary.setdefault(key, value)

答案 2 :(得分:0)

经过大量的谷歌搜索和讨论,我意识到这是语言设计问题。如果成功搜索的引用不能存储以备将来使用。(即我不能保存迭代器或类似的东西)。

如果需要大字典,他应该选择C ++。