Python DBM真的很快吗?

2024-10-05 20:13:49 发布

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

我认为Python的本地DBM应该比NOSQL数据库(如东京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.3秒 读数:0.3秒 写入:1.0s

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


Tags: import数据库closedbtimemongodb选项count
1条回答
网友
1楼 · 发布于 2024-10-05 20:13:49

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()

相关问题 更多 >