The output of the code below is
fast: 0.018553733825683594
slow: 7.0305609703063965
and, more than that, the file of slow.dat is 10,252KB while fast.dat is only 32KB. Why is the fast one small.. fast and small while slow.... is so slow and big?
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)
The docs say that shelve has problems with knowing whether a mutable structure has been modified. They suggest using
writeback=Truewhich caches the structures in memory and writes them on.syncand.close.This improved the required time and space by little but OP said that also using
.appendon these lists solves the problem.If there are still problems I would suggest using a better-suited database to your situation than
shelve.