Quais são as desvantagens do Stackless Python? [fechadas]

127

Eu tenho lido recentemente sobre o Stackless Python e parece ter muitas vantagens em comparação com o vanilla cPython. Possui todos esses recursos interessantes, como recursão infinita, microtreads, continuações etc. e, ao mesmo tempo, é mais rápido que o cPython (cerca de 10%, se for para acreditar no wiki do Python ) e compatível com ele (pelo menos nas versões 2.5, 2.6 e 3.0).

Tudo isso parece bom demais para ser verdade. No entanto, no TANSTAAFL , não vejo muito entusiasmo pelo Stackless na comunidade Python, e o PEP 219 nunca foi concretizado. Por que é que? Quais são as desvantagens do Stackless? Quais esqueletos estão escondidos no armário do Stackless?

(Eu sei que o Stackless não oferece simultaneidade real, apenas uma maneira mais fácil de programar da maneira simultânea. Isso realmente não me incomoda.)

Ryszard Szopa
fonte

Respostas:

165

Não sei de onde veio esse "Stackless é 10% mais rápido" no Wiki, mas, novamente, nunca tentei medir esses números de desempenho. Não consigo pensar no que a Stackless faz para fazer uma diferença tão grande.

Stackless é uma ferramenta incrível com vários problemas organizacionais / políticos.

O primeiro vem da história. Christian Tismer começou a falar sobre o que acabou se tornando Stackless cerca de 10 anos atrás. Ele tinha uma idéia do que queria, mas teve dificuldade em explicar o que estava fazendo e por que as pessoas deveriam usá-lo. Isso se deve em parte ao fato de sua formação não ter o treinamento em CS sobre idéias como corotinas e porque suas apresentações e discussões são muito orientadas para a implementação, o que é difícil para qualquer um que ainda não esteja em uma continuação até a cintura para entender como usá-lo como uma solução para o problema. seus problemas.

Por esse motivo, a documentação inicial era ruim. Havia algumas descrições de como usá-lo, com o melhor de colaboradores de terceiros. Na PyCon 2007, dei uma palestra sobre " Using Stackless ", que foi muito bem, de acordo com os números da pesquisa da PyCon. Richard Tew fez um ótimo trabalho coletando-os, atualizando o stackless.com e mantendo a distribuição quando novos lançamentos do Python surgirem. Ele é funcionário da CCP Games , desenvolvedora do EVE Online, que usa o Stackless como parte essencial do sistema de jogo.

Os jogos do PCC também são o maior exemplo do mundo real que as pessoas usam quando falam sobre Stackless. O principal tutorial para Stackless é " Introdução à programação simultânea com Stackless Python ", de Grant Olson , que também é orientado para o jogo. Acho que isso dá às pessoas uma ideia distorcida de que o Stackless é orientado a jogos, quando é mais que os jogos são mais facilmente orientados à continuação.

Outra dificuldade tem sido o código fonte. Em sua forma original, foram necessárias alterações em muitas partes do Python, o que deixou Guido van Rossum, líder do Python, cauteloso. Parte do motivo, penso eu, foi o suporte à chamada / cc, que mais tarde foi removido como sendo "muito parecido com o suporte a um goto quando existem melhores formulários de nível superior". Não tenho certeza sobre esse histórico, apenas leia este parágrafo como "O Stackless costumava exigir muitas alterações".

Versões posteriores não exigiam as alterações, e o Tismer continuou pressionando pela inclusão no Python. Embora tenha havido alguma consideração, a posição oficial (até onde eu sei) é que o CPython não é apenas uma implementação Python, mas serve como uma implementação de referência, e não inclui a funcionalidade Stackless, porque não pode ser implementada pelo Jython. ou Iron Python.

Não há absolutamente nenhum plano para " alterações significativas na base de código ". Esse link e citação e referência de Arafangion (veja o comentário) são de aproximadamente 2000/2001. As mudanças estruturais foram feitas há muito tempo, e é o que eu mencionei acima. O Stackless como está agora é estável e maduro, com apenas pequenos ajustes na base de código nos últimos anos.

Uma limitação final com o Stackless - não há um forte defensor do Stackless. O Tismer agora está profundamente envolvido com o PyPy , que é uma implementação do Python para Python. Ele implementou a funcionalidade Stackless no PyPy e a considera muito superior à própria Stackless, e considera que o PyPy é o caminho do futuro. Tew mantém Stackless, mas ele não está interessado em advocacy. Eu considerei estar nessa função, mas não conseguia ver como poderia obter uma receita com isso.

Embora se você quiser treinar no Stackless, não hesite em entrar em contato comigo ! :)

Andrew Dalke
fonte
39

Demorou muito tempo para encontrar essa discussão. Naquela época, eu não estava no PyPy, mas tive um caso de dois anos com a psico, até que a saúde interrompeu tudo isso de repente. Agora estou ativo novamente e desenvolvendo uma abordagem alternativa - apresentá-la no EuroPython 2012.

A maioria das declarações de Andrews está correta. Algumas pequenas adições:

O Stackless foi significativamente mais rápido que o CPython, há 10 anos, porque otimizei o loop do interpretador. Naquela época, Guido não estava pronto para isso. Alguns anos depois, as pessoas fizeram otimizações semelhantes e ainda mais e melhores, o que torna o Stackless um pouco mais lento, como esperado.

Sobre inclusão: bem, no começo eu era muito insistente e convencido de que o Stackless é o caminho a percorrer. Mais tarde, quando era quase possível ser incluído, perdi o interesse por isso e preferi deixá-lo assim, parcialmente por frustração, em parte para manter o controle do Stackless.

Os argumentos como "outras implementações não podem fazer isso" sempre pareciam coxos para mim, pois há outros exemplos em que esse argumento também pode ser usado. Achei melhor esquecer isso e manter uma boa amizade com Guido, tendo minha própria distro.

Enquanto isso, as coisas estão mudando novamente. Estou trabalhando em PyPy e Stackless como uma extensão. Falaremos sobre isso algumas vezes mais tarde

Saúde - Chris

tismer
fonte
5

Se bem me lembro, Stackless estava programado para ser incluído no CPython oficial, mas o autor do stackless disse ao pessoal do CPython para não fazê-lo, porque ele planejava fazer algumas mudanças significativas na base de código - presumivelmente ele queria que a integração fosse feita mais tarde. o projeto estava mais maduro.

Arafangion
fonte
1
Fonte? Acho isso interessante, mas obviamente não posso acreditar em você só porque você disse isso. Eu pareceria idiota se você estivesse errado e comecei a falar sobre o quão interessante era.
26411 Devin Jeanpierre
2
Excelente ponto. Desculpe, eu não tenho a referência, porque estava em uma conversa irc em #python no freenode, no entanto, consegui encontrar uma conversa antiga em gnosis.cx/download/charming_python_10_outtakes.html, que fornece muito mais informações sobre o situação.
Arafangion
Esse link é realmente ótimo. Responde a muitas das minhas perguntas.
Ryszard Szopa
Esse link tem 8 ou 9 anos (fala sobre Python 2.1) e qualquer discussão sobre futuras alterações na base de código ocorre há muito tempo. O Python sem pilha é estável e maduro, e não há planos para "mudanças significativas na base de código".
26630 Andrew Dalke
dalke: É assim que as coisas são - se houve mudanças substanciais em alguma decisão para integrar as mudanças, sinta-se à vontade para apresentar uma referência mais nova, no entanto, suspeito que a fonte antiga que forneci apenas tenha iniciado a tendência de ter variantes separadas de pitão, por exemplo, JPython, IronPytion ..
Arafangion
3

Também estou interessado nas respostas aqui. Joguei um pouco com o Stackless e parece que seria uma boa adição sólida ao Python padrão.

O PEP 219 menciona dificuldades em potencial ao chamar o código Python do código C, se o Python quiser mudar para uma pilha diferente. Seria necessário haver maneiras de detectar e impedir isso (para evitar destruir a pilha C). Eu acho que isso é tratável, então também estou me perguntando por que o Stackless deve permanecer por conta própria.

Greg Hewgill
fonte
3
O PEP 219 tem 9 anos e está seriamente desatualizado. As dificuldades de "chamar o código Python do código C" estão apenas na implementação discutida no PEP e não no Stackless. O nome do PEP ("Stackless Python") é um pouco impróprio; ele se inspirou em Stackless e é isso.
Andrew Dalke 26/02/09