zhihu - Python DBM真的很快吗?



python语言入门 (1)

我认为,Python的本地DBM应该比NOSQL数据库(如Tokyo Cabinet,MongoDB等)快得多(因为Python DBM具有较少的功能和选项,即更简单的系统)。 我测试了一个非常简单的写/读示例

#!/usr/bin/python
import time
t = time.time()
import anydbm
count = 0
while (count < 1000):
 db = anydbm.open("dbm2", "c")
 db["1"] = "something"
 db.close()
 db = anydbm.open("dbm", "r")
 print "dict['Name']: ", db['1'];
 print "%.3f" % (time.time()-t)
 db.close()
 count = count + 1

读/写:1.3s阅读:0.3s写:1.0s

MongoDb的这些值至少要快5倍。 它真的是Python DBM的性能吗?


Python没有内置的DBM实现。 它将DBM功能基于各种各样的DBM样式的第三方库,如AnyDBM,Berkeley DBM和GNU DBM。

Python的字典实现对键值存储来说非常快,但并不是持久的。 如果您需要高性能的运行时键值查找,您可以更好地找到字典 - 您可以使用cpickle或shelve来管理持久性。 如果启动时间对你很重要(如果你正在修改数据,终止) - 比运行时访问速度更重要 - 那么类似DBM的东西会更好。

在你的评估中,作为主循环的一部分,你已经包含了dbm打开的调用和数组查询。 在查看之前打开一个DBM存储一个值并关闭并重新打开是一个非常不切实际的用例,而且您会看到在以这种方式管理持久性数据存储时,会出现典型的缓慢性能相当低效)。

根据您的要求,如果您需要快速查找并且不关心启动时间,DBM可能是一个解决方案 - 但要进行基准测试,只包括循环中的写入和读取操作! 像下面的东西可能是合适的:

import anydbm
from random import random
import time

# open DBM outside of the timed loops
db = anydbm.open("dbm2", "c")

max_records = 100000

# only time read and write operations
t = time.time()

# create some records
for i in range(max_records):
  db[str(i)] = 'x'

# do a some random reads
for i in range(max_records):
  x = db[str(int(random() * max_records))]

time_taken = time.time() - t
print "Took %0.3f seconds, %0.5f microseconds / record" % (time_taken, (time_taken * 1000000) / max_records)

db.close()




dbm