Увеличьте получение приложения perf python с помощью memcache - PullRequest
2 голосов
/ 16 сентября 2011

Здравствуйте, я хочу знать, полезно ли в 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 ]

5 голосов
/ 16 сентября 2011

У вас есть memcache.set() внутри цикла.Это много ненужного трафика на сервис memcache.Сделайте это один раз, после цикла.

Далее, как вы это закодировали, нет необходимости устанавливать size.

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

или, более идиоматически

foosTab = [foo for foo in foos]

Это спасет вас от отдельного count().

2 голосов
/ 19 сентября 2011

Этот блок кода:

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 (один раз!), только если ему нужно было сначала получить список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...