Python中文
首页
教程
问答
标签
搜索
登录
注册
ANTLR4在Python中生成的解析器很慢,但在J中生成的解析器很快
回答此问题可获得
20
贡献值,回答如果被采纳可获得
50
分。
<p>我试图将ant <a href="https://github.com/fabsx00/codesensor/blob/master/CPPGrammar.g" rel="noreferrer">ANTLR3 grammar</a>转换为<a href="https://gist.github.com/zevektor/630f1e9356fe200574d9" rel="noreferrer">ANTLR4 grammar</a>,以便在antlr4-python2-runtime中使用它。 该文法是一个C/C++模糊解析器。在</p> <p>在转换之后(基本上删除了树运算符和语义/语法谓词),我使用以下命令生成了Python2文件:</p> <p><code>java -jar antlr4.5-complete.jar -Dlanguage=Python2 CPPGrammar.g4</code></p> <p>生成的代码没有任何错误,因此我将其导入我的python项目(我使用PyCharm)进行一些测试:</p> <pre><code>import sys, time from antlr4 import * from parser.CPPGrammarLexer import CPPGrammarLexer from parser.CPPGrammarParser import CPPGrammarParser currenttimemillis = lambda: int(round(time.time() * 1000)) def is_string(object): return isinstance(object,str) def parsecommandstringline(argv): if(2!=len(argv)): raise IndexError("Invalid args size.") if(is_string(argv[1])): return True else: raise TypeError("Argument must be str type.") def doparsing(argv): if parsecommandstringline(argv): print("Arguments: OK - {0}".format(argv[1])) input = FileStream(argv[1]) lexer = CPPGrammarLexer(input) stream = CommonTokenStream(lexer) parser = CPPGrammarParser(stream) print("*** Parser: START ***") start = currenttimemillis() tree = parser.code() print("*** Parser: END *** - {0} ms.".format(currenttimemillis()-start)) pass def main(argv): tree = doparsing(argv) pass if __name__ == '__main__': main(sys.argv) </code></pre> <p>问题是解析非常慢。对于一个包含大约200行的文件,需要5分钟以上才能完成,而在antlrworks中解析同一个文件只需1-2秒。 在分析antlrworks树时,我注意到<code>expr</code>规则及其所有后代都被频繁调用,我认为我需要简化/更改这些规则,以使解析器运行得更快: <img src="https://i.stack.imgur.com/kAmfq.png" alt="expr_tree"/></p> <p>我的假设是正确的还是我在转换语法时犯了一些错误?怎样才能使解析和antlrworks一样快?在</p> <p><strong>更新:</strong> 我将同样的语法导出到Java中,只用了795毫秒就完成了解析。这个问题似乎更多地与python实现有关,而不是语法本身。有什么可以做的来加速Python解析的吗?<br/> 我读过<a href="https://github.com/antlr/antlr4-python3/issues/44" rel="noreferrer">here</a>说python可能比java慢20-30倍,但在我的例子中python要慢大约400倍!在</p>
0 条评论
分类:
Python问答
请先
登录
后评论
默认排序
时间排序
1 个回答
匿名
1天前
擅长:python、mysql、java
<p>我确认python2和python3运行时存在性能问题。通过一些补丁,我在python3运行时得到了10倍的加速(大约5秒到400毫秒)。 <a href="https://github.com/antlr/antlr4/pull/1010" rel="noreferrer">https://github.com/antlr/antlr4/pull/1010</a></p>
请先
登录
后评论
针对此问题:
更多的回答
关注
89
关注
收藏
1
收藏,
216
浏览
网友 提问于 2天前
相关Python问题
无法使用Django/mongoengine连接到MongoDB(身份验证失败)
9 回答
无法使用Django\u mssql\u后端迁移到外部hos
1 回答
无法使用Django&Python3.4连接到MySql
2 回答
无法使用Django+nginx上载媒体文件
4 回答
无法使用Django1.6导入名称模式
6 回答
无法使用Django1.7和mongodb登录管理站点
10 回答
无法使用Djangoadmin创建项目,进程使用了错误的路径,因为我事先安装了错误的Python
4 回答
无法使用Djangockedi验证CBV中的字段
2 回答
无法使用Djangocketditor上载图像(错误400)
7 回答
无法使用Djangocron进行函数调用
10 回答
无法使用Djangofiler djang上载文件
10 回答
无法使用Djangokronos
3 回答
无法使用Djangomssql provid
9 回答
无法使用Djangomssql连接到带有Django 1.11的MS SQL Server 2016
6 回答
无法使用Djangomssq迁移Django数据库
7 回答
无法使用Djangonox创建用户
4 回答
无法使用Djangopyodb从Django查询SQL Server
1 回答
无法使用Djangopython3ldap连接到ldap
4 回答
无法使用Djangoredis连接到redis
7 回答
无法使用Django中的FK创建新表
6 回答