您好我想知道在appengine env中我做的事情是否有用 因为我不知道为什么这个页面很慢。
class Foo(db.Model):
id = db.StringProperty(multiline=True)
name = db.StringProperty(multiline=True)
date = db.DateTimeProperty(auto_now_add=True)
description = db.TextProperty()
carac = db.StringProperty(multiline=True)
class FoosPage(webapp.RequestHandler):
def get(self):
foos = memcache.get("all-foos")
if foos is None:
foos = Foo.all()
size = foo.count()
else :
size = len(foo)
foosTab=[]
for i in range(size) :
foosTab.insert(i,foos[i])
memcache.set("all-foos", foosTab, 60)
template_values = {
'foos': foos
}
path = os.path.join(os.path.dirname(__file__) + '/../templates/', 'foos.html')
self.response.out.write(template.render(path, template_values))
答案 0 :(得分:5)
循环中有memcache.set()
。这对memcache
服务来说是很多不必要的流量。在循环之后做一次。
此外,您编码的方式,无需建立size
。
foosTab = []
for foo in foos:
foosTab.append(foo)
或更具惯用性
foosTab = [foo for foo in foos]
这样可以省去你单独的count()
。
答案 1 :(得分:2)
这段代码:
foos = memcache.get("all-foos")
if foos is None:
foos = Foo.all()
size = foo.count()
else :
size = len(foo)
foosTab=[]
for i in range(size) :
foosTab.insert(i,foos[i])
memcache.set("all-foos", foosTab, 60)
可以用这个(更简单的)代码替换:
foos = memcache.get("all-foos")
if not foos:
foos = Foo.all.fetch(1000) # At most 1000 foos
memcache.set("all-foos", foos, 60)
具体来说,它避免了对count()
的不必要的调用(对于你在获取结果时会发现的东西会发出一个昂贵的RPC),它只进行一次获取调用,而不是迭代结果和如果必须首先获取列表,它只会调用20个批处理,并且只调用memcache set(一次!)。