производительность pyparsing и использование памяти

Pyparsing работал отлично для очень маленькой грамматики, но по мере роста грамматики производительность снижалась и использование памяти через крышу.

Мой текущий грамм:

newline = LineEnd () minus = Literal ('-') plus = Literal ('+') star = Literal ('*') dash = Literal ('/') dashdash = Literal ('//') percent = Literal ('%') starstar = Literal ('**') lparen = Literal ('(') rparen = Literal (')') dot = Literal ('.') comma = Literal (',') eq = Literal ('=') eqeq = Literal ('==') lt = Literal ('<') gt = Literal ('>') le = Literal ('<=') ge = Literal ('>=') not_ = Keyword ('not') and_ = Keyword ('and') or_ = Keyword ('or') ident = Word (alphas) integer = Word (nums) expr = Forward () parenthized = Group (lparen + expr + rparen) trailer = (dot + ident) atom = ident | integer | parenthized factor = Forward () power = atom + ZeroOrMore (trailer) + Optional (starstar + factor) factor << (ZeroOrMore (minus | plus) + power) term = ZeroOrMore (factor + (star | dashdash | dash | percent) ) + factor arith = ZeroOrMore (term + (minus | plus) ) + term comp = ZeroOrMore (arith + (eqeq | le | ge | lt | gt) ) + arith boolNot = ZeroOrMore (not_) + comp boolAnd = ZeroOrMore (boolNot + and_) + boolNot boolOr = ZeroOrMore (boolAnd + or_) + boolAnd match = ZeroOrMore (ident + eq) + boolOr expr << match statement = expr + newline program = OneOrMore (statement) 

Когда я разбираю следующие

 print (program.parseString ('3*(1+2*3*(4+5))\n') ) 

Это занимает довольно много времени:

 ~/Desktop/m2/pyp$ time python3 slow.py ['3', '*', ['(', '1', '+', '2', '*', '3', '*', ['(', '4', '+', '5', ')'], ')']] real 0m27.280s user 0m25.844s sys 0m1.364s 

И использование памяти увеличивается до 1,7 ГБ (sic!).

Я сделал какую-то серьезную ошибку в реализации этой грамматики или как еще я могу сохранить использование памяти в допустимых пределах?

One Solution collect form web for “производительность pyparsing и использование памяти”

После импорта pyparsing разрешите разбор паркета для memoize поведения разбора:

 ParserElement.enablePackrat() 

Это должно значительно повысить производительность.

  • Ускорьте петли Python / Cython.
  • Повышение производительности при создании изображений PGG в Python из данных MatLab
  • Есть ли разница в эффективности между использованием «+» и «,» в print ()?
  • Суммирование с помощью цикла for быстрее, чем с уменьшением?
  • Каков более эффективный способ выбора случайной пары объектов из списка списков или кортежей?
  • Оптимизация генерации и тестирования строки
  • Производительность стека в языках программирования
  • Обнаружение пороговых значений в цветовом пространстве HSV (из RGB) с использованием Python / PIL
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.