Tuesday, June 14, 2016

ANTLR4 very slow, the SLL trick didn't change anything

Leave a Comment

I have a grammar that is an extension of Python grammar. And small programs parse about 2 seconds on a Macbook Pro. I have taken the SLL trick and applied it:

  # Set up the lexer   inputStream = InputStream(s)   lexer = CustomLexer(inputStream)   stream = CommonTokenStream(lexer)    # Set up the error handling stuff   error_handler = CustomErrorStrategy()   error_listener = CustomErrorListener()   buffered_errors = BufferedErrorListener()   error_listener.addDelegatee(buffered_errors)    # Set up the fast parser   parser = PythonQLParser(stream)   parser._interp.predictionMode = PredictionMode.SLL   parser.removeErrorListeners()   parser.errHandler = BailErrorStrategy()    try:     tree = parser.file_input()     return (tree,parser) 

But it didn't do the trick, the time didn't change significantly. Any hints on what to do?

I'm using Python3 with antlr4-python3-runtime-4.5.3

The grammar file is here: Grammar File

And the project github page is here: Github

I have also ran a profiler, here are significant entries from the parser:

    ncalls  tottime  percall  cumtime  percall filename:lineno(function)     21    0.000    0.000    0.094    0.004 PythonQLParser.py:7483(argument)     8    0.000    0.000    0.195    0.024 PythonQLParser.py:7379(arglist)       9    0.000    0.000    0.196    0.022 PythonQLParser.py:6836(trailer)       5/3    0.000    0.000    0.132   0.044 PythonQLParser.py:6765(testlist_comp)     1    0.000    0.000    0.012    0.012 PythonQLParser.py:6154(window_end_cond)     1    0.000    0.000    0.057    0.057 PythonQLParser.py:6058(sliding_window)     1    0.000    0.000    0.057    0.057 PythonQLParser.py:5941(window_clause)     1   0.000    0.000    0.004   0.004 PythonQLParser.py:5807(for_clause_entry)     1    0.000    0.000    0.020 0.020 PythonQLParser.py:5752(for_clause)      2/1   0.000   0.000   0.068   0.068 PythonQLParser.py:5553(query_expression)        48/10    0.000    0.000    0.133    0.013 PythonQLParser.py:5370(atom)      48/7    0.000    0.000    0.315    0.045 PythonQLParser.py:5283(power)      48/7    0.000    0.000    0.315    0.045 PythonQLParser.py:5212(factor)      48/7    0.000    0.000    0.331    0.047 PythonQLParser.py:5132(term)      47/7    0.000    0.000    0.346    0.049 PythonQLParser.py:5071(arith_expr)      47/7    0.000    0.000    0.361    0.052 PythonQLParser.py:5010(shift_expr)      47/7    0.000    0.000    0.376    0.054 PythonQLParser.py:4962(and_expr)      47/7    0.000    0.000    0.390    0.056 PythonQLParser.py:4914(xor_expr)      47/7    0.000    0.000    0.405    0.058 PythonQLParser.py:4866(expr)      44/7    0.000    0.000    0.405    0.058 PythonQLParser.py:4823(star_expr)      43/7    0.000    0.000    0.422    0.060 PythonQLParser.py:4615(not_test)      43/7    0.000    0.000    0.438    0.063 PythonQLParser.py:4563(and_test)      43/7    0.000    0.000    0.453    0.065 PythonQLParser.py:4509(or_test)      43/7    0.000    0.000    0.467    0.067 PythonQLParser.py:4293(old_test)      43/7    0.000    0.000    0.467    0.067 PythonQLParser.py:4179(try_catch_expr)     43/7    0.000    0.000    0.482    0.069 PythonQLParser.py:3978(test)      1    0.000    0.000    0.048    0.048 PythonQLParser.py:2793(import_from)      1    0.000    0.000    0.048    0.048 PythonQLParser.py:2702(import_stmt)      7    0.000    0.000    1.728    0.247 PythonQLParser.py:2251(testlist_star_expr)      4    0.000    0.000    1.770    0.443 PythonQLParser.py:2161(expr_stmt)      5    0.000    0.000    1.822    0.364 PythonQLParser.py:2063(small_stmt)      5    0.000    0.000    1.855    0.371 PythonQLParser.py:1980(simple_stmt)      5    0.000    0.000    1.859    0.372 PythonQLParser.py:1930(stmt)      1    0.000    0.000    1.898    1.898 PythonQLParser.py:1085(file_input)     176    0.002    0.000    0.993    0.006 Lexer.py:127(nextToken)     420    0.000   0.000   0.535   0.001 ParserATNSimulator.py:1120(closure)    705    0.003    0.000    1.642    0.002 ParserATNSimulator.py:315(adaptivePredict) 

The PythonQL program that I was parsing is this one:

# This example illustrates the window query in PythonQL  from collections import namedtuple trade = namedtuple('Trade', ['day','ammount', 'stock_id'])  trades = [ trade(1, 15.34, 'APPL'),            trade(2, 13.45, 'APPL'),            trade(3, 8.34,  'APPL'),            trade(4, 9.87,  'APPL'),            trade(5, 10.99, 'APPL'),            trade(6, 76.16, 'APPL') ]  # Maximum 3-day sum  res = (select win         for sliding window win in ( select t.ammount for t in trades )         start at s when True         only end at e when (e-s == 2))  print (res) 

0 Answers

If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment