我听说 B-Tree 数据库比 Hash 表快,所以我想在我的项目中使用 B-Tree 数据库。python中是否有任何现有框架允许我们使用这种数据结构,或者我必须从头开始编码?
6 回答
选择 B-Tree 而不是哈希表的唯一原因,无论是在内存中还是在块存储中(如在数据库中),都是为了支持不相等的查询。b 树允许您以良好的性能执行范围查询。但是,许多键值对存储(例如 berkley db)并没有使其在外部可见,因为它们仍然散列键,但这仍然可以让您快速稳定地迭代整个数据集(即使有添加迭代器仍然有效或删除,或者必须重新平衡树)。
如果你不需要范围查询,也不需要并发迭代,那么你就不需要 b-trees,使用哈希表,在任何规模下都会更快。
编辑:我有机会让上述内容成为现实;为此,该blist
包似乎是排序容器库的最完整实现。
你真的应该看看zodb。 http://www.zodb.org/en/latest/
我做了一本关于它的专着,虽然它是西班牙语http://sourceforge.net/projects/banta/files/Labs/zodb/Monografia%20-%20ZODB.pdf/download
英文信息到处都是。
这里有一个很好的 btree 纯 python 实现。如果需要,您可以对其进行调整。
SQLite3 在内部使用 B+ 树,但听起来您可能想要一个键值存储。试试 Berkeley DB。如果您不需要事务,请尝试 HDF5。如果你想要一个分布式键值存储,还有http://scalien.com/keyspace/,但这是一个服务器-客户端类型的系统,可以打开各种 NoSQL 键值存储。
所有这些系统的插入和检索都将是 O(log(n)),因此它们可能会比您当前使用的哈希表慢。
京都内阁提供了一个哈希树,所以这可能是您正在查看的更多内容,因为它应该是 O(1) 用于插入和检索,但是如果您需要,您不能进行按顺序遍历(尽管因为您'当前正在使用哈希树,这应该不是问题)。
http://fallabs.com/kyotocabinet/
如果您正在寻找性能,您将需要在编译语言中实现速度关键项目,然后在 Python 中使用包装器 API。
您可能想看看mxBeeBase,它是 eGenix mx Base Distribution 的一部分。它包括一个快速的磁盘 B+Tree 实现,并提供允许在 Python 中构建磁盘字典或数据库的存储类。