原来可以通过key直接删除实体了

标签:Google App Engine, Python

记得最初删除实体时,还需要先fetch或get实体,再调用实体的delete方法或db.delete()来删除,这就导致了删除时效率特别低。

今天突发奇想,觉得db.delete()应该可以接受key做参数,于是看了下源码,发现果然是可行的,而且传实体给它也会被自动转换成key,那么直接传key自然效率更高。

接下来写了个例子测试了一下:
from time import time
from google.appengine.ext import db

class B(db.Model):
  pass

keys = [db.Key.from_path('B', i) for i in xrange(1, 101)]

bs = [B(key=key) for key in keys]

db.put(bs)

t = time()
bs2 = db.get(keys)
t2 = time()
db.delete(bs2)
t3 = time()

db.put(bs)

t4 = time()
db.delete(keys)
t5 = time()

print t2 - t
print t3 - t2
print t3 - t

print t5 - t4
由于网络波动太大,结果没有多少可比较性,于是我只好查看后台记录。发现先get再delete用了7910 cpu_ms和7750 api_cpu_ms,而直接delete key只用了7016 cpu_ms和6917 api_cpu_ms。
其实知道GAE服务调用机制的话就会明白,2种方法删除实体发出的request是完全一样的,所不同的是前者多了一次get的request,自然会更慢。

0条评论 你不来一发么↓

    想说点什么呢?