开发者

Increase retrieving perf python appengine with memcache

开发者 https://www.devze.com 2023-04-05 15:24 出处:网络
Hello I want to know if in the appengine env the things I did is usefull Because I don\'t know why this page is very slow.

Hello I want to know if in the appengine env the things I did is usefull Because I don't know why this page is very slow.

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开发者_如何学Python =  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))


You have the memcache.set() inside the loop. That's a lot of unnecessary traffic to the memcache service. Do it once, after the loop.

Further, the way you have that coded, there's no need for establishing size.

foosTab = []
for foo in foos:
    foosTab.append(foo)

or, more idiomatically

foosTab = [foo for foo in foos]

That'll save you doing a separate count().


This block of code:

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)

Can be replaced with this (much simpler) code:

foos = memcache.get("all-foos")
if not foos:
  foos = Foo.all.fetch(1000) # At most 1000 foos
  memcache.set("all-foos", foos, 60)

Specifically, it avoids the unnecessary call to count() (which issues an expensive RPC for something you'll find out anyway when you fetch the result), it does a single fetch call instead of iterating over the results and fetching in batches of 20, and it only calls memcache set (once!) if it had to fetch the list in the first place.

0

精彩评论

暂无评论...
验证码 换一张
取 消