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
答案 0 :(得分:6)
高CPU使用率将是由于每个请求获取100个实体。你有几个选择:
答案 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
答案 3 :(得分:0)
这取决于你得到太多CPU警告的地方。
是否在仪表板中,它可能是很多数据存储CPU,无需优化。
如果请求需要超过10秒,则需要进行优化。
如果定期发出日志警告,表明某个请求是x.xx超过CPU限制,则意味着您的应用程序代码花费的时间太长。并需要优化。
我发现很多Django模板的东西都不占用很多应用CPU(50-100 Mcycle)。如果模板的所有字段都已预先计算。