我对蟒蛇世界比较陌生,但这似乎很直接。
Google正在大吼我这个代码需要优化:
class AddLinks(webapp.RequestHandler):
def post(self):
# Hash the textarea input to generate pseudo-unique value
hash = md5.new(self.request.get('links')).hexdigest()
# Seperate the input by line
allLinks = self.request.get('links').splitlines()
# For each line in the input, add to the database
for x in allLinks:
newGroup = LinkGrouping()
newGroup.reference = hash
newGroup.link = x
newGroup.put()
# testing vs live
#baseURL = 'http://localhost:8080'
baseURL = 'http://linkabyss.appspot.com'
# Build template parameters
template_values = {
'all_links': allLinks,
'base_url': baseURL,
'reference': hash,
}
# Output the template
path = os.path.join(os.path.dirname(__file__), 'addLinks.html')
self.response.out.write(template.render(path, template_values))
仪表板告诉我这是在使用大量的CPU。
我应该在哪里寻找改进措施?
答案 0 :(得分:7)
这里的主要开销是多个单独放入数据存储区。如果可以的话,将链接存储为单个实体,正如安德烈建议的那样。您始终可以将链接拆分为数组并将其存储在ListProperty中。
如果您确实需要每个链接的实体,请尝试以下操作:
# For each line in the input, add to the database
groups = []
for x in allLinks:
newGroup = LinkGrouping()
newGroup.reference = hash
newGroup.link = x
groups.append(newGroup)
db.put(groups)
它会将数据存储区往返减少到一个,并且这是真正杀死高CPU上限的往返行程。
答案 1 :(得分:3)
看起来很紧张。
我看到一件事可能会有一点改进。 你的电话,“self.request.get('links')”两次。
添加:
unsplitlinks = self.request.get('links')
参考,“unsplitlinks”可以提供帮助。
除此之外,循环是我看到的唯一可以作为优化目标的区域。 是否可以准备数据然后立即将其添加到数据库,而不是每个链接执行数据库添加? (我假设.put()命令将链接添加到数据库中)
答案 2 :(得分:2)
只需将完整的self.request.get('links')
存储在数据库的文本字段中,即可显着减少应用与数据库之间的互动。
put()
post(self)
当有人真正调用页面时,你可以省去文本字段的解析....
答案 3 :(得分:0)
这种情况多久被召唤一次?这看起来并不那么糟糕......特别是在删除重复请求之后。
答案 4 :(得分:0)
我可以查询ListProperty吗?
像
这样的东西SELECT * FROM LinkGrouping WHERE links.contains('http://www.google.com')
我有未来的计划,我需要这个功能。
我肯定会实现单个db.put()来减少使用量。
答案 5 :(得分:0)
不/你不能使用像“links.contains('http://www.google.com')这样的东西” GQL不支持此