如果我们想要插入一个键的情况,只有在键不存在时才在我们的字典中输入值。 所以在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
每次比较或分配时,都必须进行查找。我们正在上面的代码段中执行两次搜索。我们怎样才能优化这个?
答案 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 ++。