优化Python词典中的插入操作

2024-09-30 16:26:41 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我们需要插入一个键,那么只有当键不存在时才在字典中输入值。 所以在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

每次比较或赋值都要进行查找。我们在上面的代码段中执行两个搜索。我们如何优化这个??你知道吗


Tags: keyautomakedictionaryif字典valuemy
3条回答

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%的性能提升!注意,如果只使用一次dictionary,那么解决方案(array+dictionary)实际上会比预期的差一些。对于您介绍的案例(n=2),您的性能增益仅为8%。你知道吗

记住,Python不是C或C++。如果这是一个实际的性能问题,那么就不应该使用Python。你知道吗

使用setdefault:

v = my_dictionary.setdefault(key, value)

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

如果你需要一本大字典,他应该选择C++。你知道吗

相关问题 更多 >