正群调整Python 编写速度

开发 后端
Python 编写的速度的确很慢;慢的程度不止是“我希望能快一点点”,而是“吃了一顿长时间的午餐还希望它能快点结束”的程度。

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

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

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

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

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

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

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

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

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

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

【编辑推荐】

  1. 有关Python系统文件进行介绍指导
  2. 如何正确的使用Python函数
  3. 对Python 构建工具进行详细介绍分析
  4. PythonAndroid浅析Python优势所在
  5. 如何使用Python模块解析配置文件?
责任编辑:chenqingxiang 来源: 51cto.com
相关推荐

2010-02-06 14:59:37

Android程序

2014-04-08 16:54:27

移动应用运营

2022-05-25 16:31:25

数据泄露勒索软件网络攻击

2021-10-19 10:03:06

Windows 功能系统

2021-01-11 13:20:06

Python图像大小编程语言

2020-04-30 21:25:33

Python 函数程序员

2021-07-07 15:27:48

5G运营商网络

2023-12-12 11:38:56

聊天机器人ChatGPTOpenAI

2013-09-27 10:26:49

腾讯架构调整

2024-03-11 15:47:11

RustPython代码

2021-10-12 15:15:01

深度学习神经网络人工智能

2021-06-18 15:15:51

机器学习Rust框架

2023-01-13 18:10:17

Windows 11微软

2021-02-20 09:27:36

Python编程语言机器学习

2020-09-30 08:32:40

Python

2022-03-03 15:05:46

微软Windows 11

2017-06-16 21:00:02

Python爬虫

2010-02-03 13:55:51

Python 代码

2010-02-02 18:20:43

Python编写

2023-12-18 18:58:54

Python类型提示代码
点赞
收藏

51CTO技术栈公众号