最近我在维基百科上完成了一些数据挖掘方面的任务。它由这些部分组成:
解析enwiki-pages-articles.xml的维基百科转储;
把类别和页存储到MongoDB里面;
对类别名称进行重新分门别类。
我对CPython 2.7.3和PyPy 2b的实际任务性能进行了测试。我使用的库是:
redis 2.7.2
pymongo 2.4.2
此外CPython是由以下库支持的:
hiredis
pymongo c-extensions
测试主要包含数据库解析,所以我没预料到会从PyPy得到多大好处(何况CPython的数据库驱动是C写的)。
下面我会描述一些有趣的结果。
电脑技术002pc 对《python软件安装配置要求PyPy 和 CPython 的性能比较测试》总结来说,为我们电脑知识很实用。
抽取维基页名
我需要在所有维基百科的类别中建立维基页名到page.id的联接并存储重新分配好的它们。最简单的解决方案应该是导入enwiki-page.sql(定义了一个RDB表)到MySQL里面,然后传输数据、进行重分配。但我不想增加MySQL需求(有骨气!XD)所以我用纯Python写了一个简单的SQL插入语句解析器,然后直接从enwiki-page.sql导入数据,进行重分配。
这个任务对CPU依赖更大,所以我再次看好PyPy。
/ time
PyPy 169.00s 用户态 8.52s 系统态 90% CPU
CPython 1287.13s 用户态 8.10s 系统态 96% CPU
我也给page.id->类别做了类似的联接(我笔记本的内存太小了,不能保存供我测试的信息了)。
从enwiki.xml中筛选类别
为了方便工作,我需要从enwiki-pages-articles.xml中过滤类别,并将它们存储相同的XML格式的类别。因此我选用了SAX解析器,在PyPy和CPython中都适用的包装器解析。对外的原生编译包(同事在PyPy和CPython 中) 。
代码非常简单:class WikiCategoryHandler(handler.ContentHandler):
“””Class which detecs category pages and stores them separately
“””
ignored = set((‘contributor’, ‘comment’, ‘meta’))
def __init__(self, f_out):
handler.ContentHandler.__init__(self)
self.f_out = f_out
self.curr_page = None
self.curr_tag = ”
self.curr_elem = Element(‘root’, {})
self.root = self.curr_elem
self.stack = Stack()
self.stack.push(self.curr_elem)
self.skip = 0
def startElement(self, name, attrs):
if self.skip>0 or name in self.ignored:
self.skip += 1
return
self.curr_tag = name
elem = Element(name, attrs)
if name == ‘page’:
elem.ns = -1
self.curr_page = elem
else: # we don’t want to keep old pages in memory
self.curr_elem.append(elem)
self.stack.push(elem)
self.curr_elem = elem
def endElement(self, name):
if self.skip>0:
self.skip -= 1
return
if name == ‘page’:
self.task()
self.curr_page = None
self.stack.pop()
self.curr_elem = self.stack.top()
self.curr_tag = self.curr_elem.tag
def characters(self, content):
if content.isspace(): return
if self.skip == 0:
self.curr_elem.append(TextElement(content))
if self.curr_tag == ‘ns’:
self.curr_page.ns = int(content)
def startDocument(self):
self.f_out.write(“n”)
def endDocument(self):
self.f_out.write(“
print(“FINISH PROCESSING WIKIPEDIA”)
def task(self):
if self.curr_page.ns == 14:
self.f_out.write(self.curr_page.render())
class Element(object):
def __init__(self, tag, attrs):
self.tag = tag
self.attrs = attrs
self.childrens = []
self.append = self.childrens.append
def __repr__(self):
return “Element {}”.format(self.tag)
def render(self, margin=0):
if not self.childrens:
return u”{0}“.format(
” “*margin,
self.tag,
“”.join([‘ {}=”{}”‘.format(k,v) for k,v in {}.iteritems()]))
if isinstance(self.childrens[0], TextElement) and len(self.childrens)==1:
return u”{0}{3}{1}>”.format(
” “*margin,
self.tag,
“”.join([u’ {}=”{}”‘.format(k,v) for k,v in {}.iteritems()]),
self.childrens[0].render())
return u”{0}n{3}n{0}{1}>”.format(
” “*margin,
self.tag,
“”.join([u’ {}=”{}”‘.format(k,v) for k,v in {}.iteritems()]),
“n”.join((c.render(margin+2) for c in self.childrens)))
class TextElement(object):
def __init__(self, content):
self.content = content
def __repr__(self):
return “TextElement” def render(self, margin=0):
return self.content
更多:python软件安装配置要求PyPy 和 CPython 的性能比较测试
https://www.002pc.comhttps://www.002pc.com/python/3801.html
你可能感兴趣的PyPy,CPython,测试,性能,比较No alive nodes found in your cluster
0踩
赏
0 赞
文章知识点与官方知识档案匹配,可进一步学习相关知识Python入门技能树科学计算基础软件包NumPy安装配置212224 人正在系统学习中 相关资源:诗词鉴赏大全软件-教育文档类资源-CSDN文库
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!