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