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
。
下面代码的输出是
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
。