正群调整Python编写速度

Spark 是一种用 Python 编写的强大的、通用的解析器/编译器框架。在某些方面,Spark 所提供的比 SimpleParse 或其它 Python 解析器提供的都要多,下面进行学习研究。

专注于为中小企业提供网站设计制作、成都做网站服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业枞阳免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了1000多家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。

然而,因为它完全是用 Python 编写的,所以速度也会比较慢。David 在本文中讨论了 Spark 模块,给出了一些代码样本,解释了它的用途,并对其应用领域提供了一些建议。本文中会介绍一些解析的基本概念,并对 Spark 模块进行了讨论。解析框架是一个内容丰富的主题,它值得我们多花时间去全面了解;

这两篇文章为读者和我自己都开了一个好头。在日常的编程中,我经常需要标识存在于文本文档中的部件和结构,这些文档包括:日志文件、配置文件、定界的数据以及格式更自由的(但还是半结构化的)报表格式。所有这些文档都拥有它们自己的“小语言”,用于规定什么能够出现在文档内。我编写这些非正式解析任务的程序的方法总是有点象大杂烩。

其中包括定制状态机、正则表达式以及上下文驱动的字符串测试。这些程序中的模式大概总是这样:“读一些文本,弄清是否可以用它来做些什么,然后可能再多读一些文本,一直尝试下去。”

解析器将文档中部件和结构的描述提炼成简明、清晰和说明性的规则,确定由什么组成文档。大多数正式的解析器都使用扩展巴科斯范式(Extended Backus-Naur Form,EBNF)上的变体来描述它们所描述的语言的“语法”。

基本上,EBNF 语法对您可能在文档中找到的部件赋予名称;另外,较大的部件通常由较小的部件组成。小部件在较大的部件中出现的频率和顺序由操作符指定。举例来说,清单 1 是 EBNF 语法 typographify.def,我们在 SimpleParse 那篇文章中见到过这个语法(其它工具运行的方式稍有不同):

 
 
 
  1. #-*- encoding: gb2312 -*-
  2. import quopri
  3. a = "only a test数据"
  4. b = quopri.encodestring(a) # 对字符串编码
  5. print b
  6. print quopri.decodestring(b) # 对字符串解码
  7. import StringIO
  8. c = StringIO.StringIO()
  9. d = StringIO.StringIO()
  10. e = StringIO.StringIO()
  11. c.write(a)
  12. c.seek(0)
  13. quopri.encode(c, d, 0)  # 编码StringIO中的数据, 第三个参数0表示不对空格和tab符号编码,为1表示进行编码
  14. print d.getvalue()
  15. d.seek(0)
  16. quopri.decode(d, e)  # 解码StringIO中的数据
  17. print e.getvalue()
  18. f1 = open("aaa.txt", "w")
  19. f1.write(a)
  20. f1.close()
  21. f1 = open("aaa.txt", "r")
  22. f2 = open("bbb.txt", "w")
  23. quopri.encode(f1, f2, 0) # 编码aaa.txt中的数据到bbb.txt
  24. f1.close()
  25. f2.close()
  26. print open("bbb.txt", "r").read()

这里有一个有趣的地方。WordScanner 本身是一个完美的扫描程序类;但 Spark 扫描程序类本身可以通过继承进一步特化:子正则表达式模式在父正则表达式之前匹配,而如果需要,子方法/正则表达式可以覆盖父方法/正则表达式。

所以,WordPlusScanner 将在 WordScanner 之前对特化进行匹配(可能会因此先获取一些字节)。模式文档字符串中允许使用任何正则表达式(举例来说,.t_contraction() 方法包含模式中的一个“向后插入”)。查找记号的确有一点意思,但真正有意思的是如何向记号列表应用语法。解析阶段在记号列表的基础上创建任意的树结构。它只是指定了表达式语法而已。

Spark 有好几种创建 AST 的方法。“手工”的方法是特化 GenericParser 类。在这种情况下,具体子解析器会提供很多方法。方法名的形式为 p_foobar(self, args)。每个这样的方法的文档字符串都包含一个或多个模式到名称的分配。只要语法表达式匹配,每种方法就可以包含任何要执行的代码。

分享文章:正群调整Python编写速度
网页路径:http://www.gawzjz.com/qtweb/news11/181261.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联