Python shelve 模块为什么这个代码快,而另一个慢?

Python shelve module why is this code fast, but the other slow?

下面代码的输出是

fast: 0.018553733825683594
slow: 7.0305609703063965

而且,不仅如此,slow.dat 的文件有 10,252KB,而 fast.dat 只有 32KB。为什么快的小.. 快的小而慢的.. 又慢又大?

import shelve
import random
import time

start = time.time()
db = shelve.open('fast') 

db["answers"] = []
answers = []

for i in range(1000):
    answer = {
        "foo0": random.randint(1,10),
        "foo1": random.randint(1,10),
        "foo2": random.randint(1,10),
        "foo3": random.randint(1,10),
        "foo4": random.randint(1,10),
        "foo5": random.randint(1,10)
    }
    answers.append(answer)

db['answers'] = answers
db.close()
print("fast:", time.time() - start)


start = time.time()
db = shelve.open('slow') # slow and uses !!!!WAY MORE SPACE!!!!
db["answers"] = []

for i in range(1000):
    answer = {
        "foo0": random.randint(1,10),
        "foo1": random.randint(1,10),
        "foo2": random.randint(1,10),
        "foo3": random.randint(1,10),
        "foo4": random.randint(1,10),
        "foo5": random.randint(1,10)
    }
    db['answers'] = db['answers'] + [answer]

db.close()
print("slow:", time.time() - start)

在第一个示例中,您将追加到一个列表,而在第二个示例中,您将在循环的每次迭代中创建一个新列表。

mylist.append(obj) -> 添加到现有列表

mylist = mylist + [obj] -> 将两个列表组合成一个新列表。

每次创建一个新列表比仅仅追加更昂贵。

mylist += [obj] 可能是您想要的 - 这与附加相同 - 相同的操作,不同的语法。

docs 说 shelve 在了解可变结构是否已被修改方面存在问题。他们建议使用 writeback=True 将结构缓存在内存中并将它们写入 .sync.close.

这稍微改善了所需的时间和 space,但 OP 表示在这些列表上也使用 .append 可以解决问题。

如果仍然存在问题,我建议使用 better-suited 数据库而不是 shelve