2010-07-02 11 views
19

Tengo una gran gramática desarrollada para pyparsing como parte de una aplicación de Python grande y pura. He alcanzado el límite de ajustes de rendimiento y estoy en el punto en que los rendimientos decrecientes me hacen comenzar a buscar en otra parte. Sí, creo que conozco la mayoría de los consejos y trucos y he perfilado mi gramática y mi aplicación al polvo.¿qué sigue después de pyparsing?

¿Qué sigue?

Espero encontrar un analizador sintáctico que me brinde la misma facilidad de lectura y usabilidad (estoy usando muchas funciones avanzadas de pyparsing como parse-actions para comenzar el procesamiento posterior de la entrada que se analiza) y la integración con Python a 10 × el rendimiento.

Me encanta el hecho de que la gramática es pura Python.

Todos mis bloques básicos son expresiones regulares, por lo que reutilizarlos sería bueno.

Sé que no puedo tener todo, así que estoy dispuesto a renunciar a algunas de las funciones que tengo hoy para llegar al rendimiento de 10 × solicitado.

¿A dónde voy desde aquí?

+0

Optimice su uso http://cython.org/ – jvitoroc

Respuesta

6

Parece que la gente de pyparsing ha anticipado su problema. De http://pyparsing.wikispaces.com/HowToUsePyparsing:

Rendimiento de pyparsing puede ser lento para gramáticas complejas y/o grandes cadenas de entrada. El paquete psyco se puede utilizar para mejorar la velocidad del módulo pyparsing sin cambios en la lógica de la gramática o el programa: las mejoras observadas han estado en el rango del 20-50%.

Sin embargo, como se señaló Vangel en los comentarios abajo, psyco es un proyecto obsoleto a partir de marzo de 2012. Su sucesor es el proyecto PyPy, que se inicia desde el mismo enfoque básico para la prestación del servicio: utilizar un JIT compilador de código nativo en lugar de un intérprete de bytecode Debería poder obtener ganancias similares o mayores con PyPy si las implementaciones de Python le funcionan.

Si realmente eres un demonio de la velocidad, pero quieres mantener algo de la legibilidad y la sintaxis declarativa, te sugiero que eches un vistazo a ANTLR. Probablemente no sea el back-end generador de Python; Soy escéptico acerca de si es lo suficientemente maduro o de alto rendimiento para sus necesidades. Estoy hablando de los bienes: el backend de C que lo inició todo.

Enrolle un módulo de extensión Python C alrededor del punto de entrada al analizador, y suéltelo.

Habiendo dicho eso, va a renunciar a mucho en esta transición: básicamente, cualquier Python que desee hacer en su analizador tendrá que hacerse a través de la API C (no del todo bonita). Además, tendrás que acostumbrarte a formas muy diferentes de hacer las cosas. ANTLR tiene sus encantos, pero no se basa en combinadores, por lo que no existe la relación fácil y fluida entre tu gramática y tu lenguaje que existe en pyparsing. Además, es su propia DSL, muy similar a lex/yacc, que puede presentar una curva de aprendizaje, pero, debido a que está basada en LL, probablemente le resultará más fácil adaptarse a sus necesidades.

+0

psyco está muerto y ya no se mantiene. Sin embargo, encontré PyPy y lo intento. Respuestas 2013? – Vangel

+2

@Vangel - mira en http://www.cython.org – Russ

+0

sí lo hice en Cython, pero no puedo entender cómo funciona cython con los programas de Pyton aquí. Aparentemente hay cosas listas para pyparsing y cython pero está en la rama de pyparsing 2.x para python 3.0 o estoy totalmente confundido ahora. – Vangel

1

No hay forma de saber qué tipo de beneficio obtendrás sin solo probarlo, pero está dentro del rango de posibilidad de que puedas obtener 10x de beneficios simplemente usando Unladen Swallow si tu proceso es prolongado y repetitivo.(Además, si tiene que analizar muchas cosas y normalmente inicia un nuevo intérprete para cada una, Unladen Swallow se vuelve más rápido, hasta cierto punto, cuanto más tiempo ejecuta, de modo que mientras analiza una entrada puede no mostrar mucha ganancia, es posible que obtener ganancias significativas en las entradas 2da y 3ra en el mismo proceso).

(Nota: tirar de la última de SVN - obtendrá un rendimiento mucho mejor que el último tarball)

+0

Nick - Comencé a leer sobre EE. UU., Y mientras estoy instalando, compilando y compilando, me encontré con los puntos de referencia de la presentación de Pycon2010. ¡No veo ningún punto de referencia con incluso una ganancia 2 veces superior a CPython 2.6.4! ¿Por qué esperas algo mejor? Dicho esto, esta es la opción más fácil, así que también podría intentarlo ... –

+0

@Tal: Mi propia experiencia personal, realmente (capaz de obtener una mejora de velocidad de 3.5-4x en algunos códigos de análisis). Los puntos de referencia de los EE. UU. Son puntos de referencia del mundo real, lo cual es útil, pero se pierden los beneficios de volver a adaptar el código para obtener un mayor beneficio de EE. UU., Específicamente creando un proceso de larga duración en lugar de un conjunto de procesos breves para hacer su trabajo. Cuando hice mis pruebas de análisis, la diferencia en el análisis de un archivo fue marginal, tal vez un 5-10% más rápido, pero cuando el décimo archivo fue alimentado a través del mismo proceso analizador, estaba operando casi un 400% más rápido. –

2

Cambio a un/C++ C analizador generado (usando antlr, Flex/bisontes, etc.). Si puede retrasar las reglas de acción hasta que haya terminado de analizar, es posible que pueda crear un AST con código trivial y luego devolverlo a su código python a través de SWIG y procesarlo con sus reglas de acción actuales . OTOH, para que eso te dé un impulso de velocidad, el análisis tiene que ser el trabajo pesado. Si sus reglas de acción son el gran costo, entonces esto no le comprará nada a menos que también escriba sus reglas de acción en C (pero puede que tenga que hacerlo de todos modos para evitar pagar la impedancia que no coincida entre Python y el código C) .

2

Si realmente desea rendimiento para gramáticas grandes, busque no más allá de SimpleParse (que a su vez se basa en mxTextTools, una extensión C). Sin embargo, sepa ahora que esto tiene el costo de ser más críptico y requiere que esté bien versado en EBNF.

Definitivamente no es la ruta más Pythonic, y vas a tener que empezar de nuevo con una gramática EBNF para usar SimpleParse.

Cuestiones relacionadas