使用memcache增加检索perf python appengine

时间:2011-09-16 17:08:52

标签: python google-app-engine

您好我想知道在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))

2 个答案:

答案 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(一次!)。