大多数情况下,性能损失(通常发生在碰撞中)会在所有调用中摊销。因此,对于最实际的使用,您不会O(n)
每次通话都收到。事实上,唯一会导致O(n)
每次调用都受到打击的情况是每个键的哈希与现有键的哈希值冲突的病态情况(即哈希表的最坏可能(或最不幸)的使用)。
例如,如果您事先知道您的一组键,并且您知道它们不会发生散列冲突(即它们的所有散列都是唯一的),那么您将不会遇到冲突情况。另一个主要O(n)
操作是哈希表调整大小,但这种操作的频率取决于实现(扩展因子/哈希函数/冲突解决方案等),并且它也会根据输入集在运行之间变化。
在任何一种情况下,如果您可以使用所有键预先填充字典,您都可以避免突然的运行时减速。这些值可以设置为无,然后用它们的实际值填充。当最初用键“启动”字典时,这应该会导致唯一明显的性能损失,并且未来的值插入应该是恒定的时间。
一个完全不同的问题是您打算如何读取/查询结构?您是否需要附加单独的值并通过密钥访问它们?应该订购吗?也许 aset
可能比 a 更合适dict
,因为您实际上并不需要key:value
映射。
更新:
根据您在评论中的描述,即使您正在使用临时集,这听起来更像是数据库要做的工作。您可以使用内存中的关系数据库(例如使用 SQLite)。此外,您可以使用像 SQLAlchemy 这样的 ORM 以更 Python 的方式与数据库交互,而无需编写 SQL。
甚至听起来您可能一开始就从数据库中读取数据,所以也许您可以进一步利用它?
存储/查询/更新大量唯一键入的记录正是 RDBMS 经过数十年的开发和研究专门从事的工作。使用预先存在的关系数据库(例如 SQLite 的)的内存版本可能是更实用和可持续的选择。
尝试使用 python 的内置模块并通过在构建时提供 db 文件路径来sqlite3
尝试内存版本:":memory:"
con = sqlite3.connect(":memory:")