优化Google App Engine代码

时间:2008-11-18 08:51:42

标签: python google-app-engine optimization

Google应用引擎告诉我优化此代码。有什么想法,我能做什么?

def index(request):
    user = users.get_current_user()
    return base.views.render('XXX.html', 
                 dict(profiles=Profile.gql("").fetch(limit=100), user=user))

后来在模板中我做了:

{% for profile in profiles %}
  <a href="/profile/{{profile.user.email}}/"><img src="{{profile.gravatarUrl}}"></a>
  <a href="/profile/{{profile.user.email}}/">{{ profile.user.nickname }}</a>
  <br/>{{ profile.shortDisplay }}

使用的方法是:

def shortDisplay(self):
    return "%s/day; %s/week; %s days" % (self.maxPerDay, self.maxPerWeek, self.days)

def gravatarUrl(self):
    email = self.user.email().lower()
    default = "..."
    gravatar_url = "http://www.gravatar.com/avatar.php?"
    gravatar_url += urllib.urlencode({'gravatar_id':hashlib.md5(email).hexdigest(), 
        'default':default, 'size':"64"})
    return gravatar_url

4 个答案:

答案 0 :(得分:6)

高CPU使用率将是由于每个请求获取100个实体。你有几个选择:

  • 使用Profile.all()。fetch(100)将会更快,更容易阅读。
  • 从Profile模型中删除任何无关的属性。反序列化实体具有重要的每个属性开销。
  • 每页显示的用户数量减少。
  • 将此页面的输出存储在memcache中,并尽可能从memcache进行渲染。这样,你不需要经常生成页面,所以如果它的CPU很高,那就无所谓了。

答案 1 :(得分:3)

我猜想每次在每个项目上执行md5哈希是非常昂贵的。更好地将gravatar电子邮件哈希存储在某处。

答案 2 :(得分:1)

我遇到了一个问题,很多CPU被用于看似很少的工作,结果却是多次运行查询。例如。在我的Django模板中,我做了post.comments.count,然后通过post.comments循环。这导致两次执行 - 一次获得计数,一次获得实体。糟糕!

我还说要抓一份Guido的Appstats。它对Python没有帮助,但是看看在API调用中花费的时间(以及它们之间的时间 - 这通常表明你的Python速度很慢)非常有用。

您可以在此处获取图书馆:https://sites.google.com/site/appengineappstats/

我在我的博客上写了一篇关于它的文章(有一些截图):http://blog.dantup.com/2010/01/profiling-google-app-engine-with-appstats

Appstats http://blog.dantup.com/pi/appstats_4_thumb.png

答案 3 :(得分:0)

这取决于你得到太多CPU警告的地方。

是否在仪表板中,它可能是很多数据存储CPU,无需优化。

如果请求需要超过10秒,则需要进行优化。

如果定期发出日志警告,表明某个请求是x.xx超过CPU限制,则意味着您的应用程序代码花费的时间太长。并需要优化。

我发现很多Django模板的东西都不占用很多应用CPU(50-100 Mcycle)。如果模板的所有字段都已预先计算。