¿Cuáles son los inconvenientes de Stackless Python? [cerrado]

127

He estado leyendo recientemente sobre Stackless Python y parece tener muchas ventajas en comparación con Vanilla cPython. Tiene todas esas características geniales como recursión infinita, microthreads, continuaciones, etc. y al mismo tiempo es más rápido que cPython (alrededor del 10%, si se cree en el wiki de Python ) y compatible con él (al menos las versiones 2.5, 2.6 y 3.0).

Todo esto parece casi demasiado bueno para ser verdad. Sin embargo, TANSTAAFL , no veo mucho entusiasmo por Stackless entre la comunidad de Python, y PEP 219 nunca se ha hecho realidad. ¿Porqué es eso? ¿Cuáles son los inconvenientes de Stackless? ¿Qué esqueletos se esconden en el armario de Stackless?

(Sé que Stackless no ofrece concurrencia real, solo una forma más fácil de programar de manera concurrente. Realmente no me molesta).

Ryszard Szopa
fuente

Respuestas:

165

No sé de dónde vino ese "Stackless es un 10% más rápido" en el Wiki, pero nunca he tratado de medir esos números de rendimiento. No puedo pensar en lo que hace Stackless para hacer una diferencia tan grande.

Stackless es una herramienta increíble con varios problemas organizativos / políticos.

El primero viene de la historia. Christian Tismer comenzó a hablar sobre lo que finalmente se convirtió en Stackless hace unos 10 años. Tenía una idea de lo que quería, pero le costaba explicar lo que estaba haciendo y por qué la gente debería usarlo. Esto se debe en parte a que su experiencia no tenía la capacitación de CS sobre ideas como las corutinas y porque sus presentaciones y debates están muy orientados a la implementación, lo que es difícil para cualquier persona que aún no esté a la altura de las continuaciones para comprender cómo usarlo como una solución para sus problemas.

Por esa razón, la documentación inicial era deficiente. Hubo algunas descripciones de cómo usarlo, con lo mejor de terceros contribuyentes. En PyCon 2007 di una charla sobre " Uso de Stackless " que funcionó bastante bien, según los números de la encuesta de PyCon. Richard Tew ha hecho un gran trabajo recolectando estos, actualizando stackless.com y manteniendo la distribución cuando surgen nuevos lanzamientos de Python. Es empleado de CCP Games , desarrolladores de EVE Online, que utiliza Stackless como parte esencial de su sistema de juego.

Los juegos CCP también son el ejemplo más grande del mundo real que las personas usan cuando hablan de Stackless. El tutorial principal para Stackless es la " Introducción a la programación concurrente con Python apilable " de Grant Olson , que también está orientada al juego. Creo que esto le da a la gente una idea sesgada de que Stackless está orientado a los juegos, cuando es más que los juegos están más orientados a la continuación.

Otra dificultad ha sido el código fuente. En su forma original, requirió cambios en muchas partes de Python, lo que hizo que Guido van Rossum, el líder de Python, desconfiara. Creo que parte de la razón fue el soporte para call / cc que luego se eliminó por ser "demasiado parecido a soportar un goto cuando hay mejores formas de nivel superior". No estoy seguro de este historial, así que solo lea este párrafo como "Stackless solía requerir demasiados cambios".

Las versiones posteriores no requirieron los cambios, y Tismer continuó presionando para su inclusión en Python. Si bien hubo cierta consideración, la postura oficial (hasta donde yo sé) es que CPython no es solo una implementación de Python, sino que se entiende como una implementación de referencia, y no incluirá la funcionalidad Stackless porque Jython no puede implementarla o pitón de hierro.

No hay absolutamente ningún plan para " cambios significativos en la base del código ". Esa cita e hipervínculo de referencia de Arafangion (ver el comentario) son de aproximadamente 2000/2001. Los cambios estructurales se han hecho durante mucho tiempo, y es lo que mencioné anteriormente. Stackless como es ahora es estable y maduro, con solo pequeños ajustes en la base de código en los últimos años.

Una limitación final con Stackless: no hay un gran defensor de Stackless. Tismer ahora está profundamente involucrado con PyPy , que es una implementación de Python para Python. Ha implementado la funcionalidad Stackless en PyPy y la considera muy superior a Stackless, y siente que PyPy es el camino hacia el futuro. Tew mantiene Stackless pero no está interesado en la defensa. Pensé en desempeñar ese papel, pero no podía ver cómo podía obtener ingresos de él.

Aunque si quieres entrenar en Stackless, ¡no dudes en contactarme ! :)

Andrew Dalke
fuente
39

Me llevó bastante tiempo encontrar esta discusión. En ese momento no estaba en PyPy, pero tuve una aventura de 2 años con psyco, hasta que la salud detuvo todo esto abruptamente. Ahora estoy activo nuevamente y estoy diseñando un enfoque alternativo: lo presentaré en EuroPython 2012.

La mayoría de las declaraciones de Andrews son correctas. Algunas adiciones menores:

Stackless fue significativamente más rápido que CPython, hace 10 años, porque optimicé el bucle de intérprete. En ese momento, Guido no estaba listo para eso. Unos años más tarde, las personas hicieron optimizaciones similares e incluso más y mejores, lo que hace que Stackless sea un poco más lento, como se esperaba.

Sobre la inclusión: bueno, al principio era muy agresivo y estaba convencido de que Stackless es el camino a seguir. Más tarde, cuando era casi posible ser incluido, perdí el interés en eso y preferí dejarlo así, en parte por frustración, en parte para mantener el control de Stackless.

Los argumentos como "otras implementaciones no pueden hacerlo" siempre me parecieron poco convincentes, ya que hay otros ejemplos en los que este argumento también podría usarse. Pensé que sería mejor olvidarlo y mantener una buena amistad con Guido, teniendo mi propia distribución.

Mientras tanto, las cosas están cambiando de nuevo. Estoy trabajando en PyPy y Stackless como una extensión Hablaremos de eso a veces más tarde

Saludos - Chris

tismer
fuente
5

Si recuerdo bien, Stackless estaba programado para su inclusión en el CPython oficial, pero el autor de stackless le dijo a la gente de CPython que no lo hicieran, porque planeaba hacer algunos cambios significativos en la base del código, presumiblemente quería que la integración se hiciera más tarde cuando El proyecto fue más maduro.

Arafangion
fuente
1
¿Fuente? Esto me parece interesante, pero obviamente no puedo creerte solo porque lo dijiste. Me vería tonto si te equivocases y comencé a hablar de lo interesante que era.
Devin Jeanpierre
2
Excelente punto Lo siento, no tengo la referencia, porque estaba en una conversación irc en #python en freenode, sin embargo, pude encontrar una conversación antigua en la lista de correo en gnosis.cx/download/charming_python_10_outtakes.html que da mucha más información sobre el situación.
Arafangion
Ese enlace es realmente genial. Responde muchas de mis preguntas.
Ryszard Szopa
Ese enlace tiene 8 o 9 años (habla de Python 2.1) y cualquier discusión sobre futuros cambios en la base del código ha ocurrido durante mucho tiempo. Stackless Python es estable y maduro, y no hay planes para "cambios significativos en la base del código".
Andrew Dalke
dalke: Así son las cosas: si ha habido cambios sustanciales en cualquier decisión de integrar los cambios, siéntase libre de encontrar una referencia más nueva, sin embargo, sospecho que esa fuente antigua que proporcioné simplemente comenzó la tendencia de tener variantes separadas de python, p. ej., JPython, IronPytion ..
Arafangion
3

También estoy interesado en las respuestas aquí. He jugado un poco con Stackless y parece que sería una buena adición sólida a Python estándar.

PEP 219 menciona posibles dificultades para llamar al código Python desde el código C, si Python quiere cambiar a una pila diferente. Tendría que haber formas de detectar y prevenir esto (para evitar destruir la pila C). Sin embargo, creo que esto es manejable, así que también me pregunto por qué Stackless debe sostenerse por sí mismo.

Greg Hewgill
fuente
3
PEP 219 tiene 9 años y está muy desactualizado. Las dificultades de "llamar al código Python desde el código C" se encuentran solo en la implementación que se discute en el PEP, y no en Stackless. El nombre de la PEP ("Python apilable") es un nombre poco apropiado; se inspiró en Stackless y eso es todo.
Andrew Dalke