【发布时间】:2010-04-01 20:48:16
【问题描述】:
我将一些 RSS 提要提取到 App Engine 中的数据存储区,以便为 iPhone 应用程序提供服务。我使用 cron 来安排每 x 分钟更新一次 RSS。每个任务只解析一个 RSS 提要(有 15-20 项)。我经常在 App Engine 仪表板中收到有关 CPU 使用率过高的警告,因此我正在寻找优化代码的方法。
目前,我使用 minidom(因为它已经在 App Engine 上),但我怀疑它不是很有效!
代码如下:
dom = minidom.parseString(urlfetch.fetch(url).content)
if dom:
items = []
for node in dom.getElementsByTagName('item'):
item = RssItem(
key_name = self.getText(node.getElementsByTagName('guid')[0].childNodes),
title = self.getText(node.getElementsByTagName('title')[0].childNodes),
description = self.getText(node.getElementsByTagName('description')[0].childNodes),
modified = datetime.now(),
link = self.getText(node.getElementsByTagName('link')[0].childNodes),
categories = [self.getText(category.childNodes) for category in node.getElementsByTagName('category')]
);
items.append(item);
db.put(items);
def getText(self, nodelist):
rc = ''
for node in nodelist:
if node.nodeType == node.TEXT_NODE:
rc = rc + node.data
return rc
没有发生太多事情,但脚本通常需要 2-6 秒的 CPU 时间,这对于循环 20 多个项目和读取一些属性来说似乎有点过分。
我可以做些什么来加快速度?上面的代码有什么特别糟糕的地方,还是我应该改用另一种解析方式?有没有更好的库(适用于 App Engine),或者我自己会更好地解析 RSS?
【问题讨论】:
-
嗨,丹尼,我更新了我的评论,加入了 brett slatkin 的视频,他还不得不解决解析速度变慢的问题,并编写了自己的闪电般快速的实现。