2009-02-26 6 views
117

Recentemente ho letto su Stackless Python e sembra avere molti vantaggi rispetto a cPython vaniglia. Ha tutte quelle caratteristiche interessanti come la ricorsione infinita, microrreads, continuazioni, ecc. E allo stesso tempo è più veloce di cPython (circa il 10%, se si crede a the Python wiki) e compatibile con esso (almeno versioni 2.5, 2.6 e 3.0).Quali sono gli svantaggi di Stackless Python?

Tutto questo sembra quasi troppo bello per essere vero. Tuttavia, TANSTAAFL, non vedo molto entusiasmo per Stackless tra la comunità Python, e PEP 219 non è mai venuto in realizzazione. Perché? Quali sono gli svantaggi di Stackless? Quali scheletri sono nascosti nell'armadio senza pila?

(lo so Stackless non offre vera concorrenza, solo un modo più semplice di programmazione in modo concomitante. Realmente non mi preoccupa.)

risposta

149

Non so da dove provenga "Stackless è il 10% più veloce" del Wiki, ma di nuovo non ho mai provato a misurare quei numeri di prestazioni. Non riesco a pensare a cosa sia Stackless per fare la differenza così tanto.

Stackless è uno strumento straordinario con diversi problemi organizzativi/politici.

Il primo viene dalla storia. Christian Tismer iniziò a parlare di ciò che alla fine divenne Stackless circa 10 anni fa. Aveva un'idea di ciò che voleva, ma aveva difficoltà a spiegare cosa stava facendo e perché la gente dovrebbe usarlo. Ciò è in parte dovuto al fatto che il suo background non ha avuto la formazione di CS su idee come le coroutine e perché le sue presentazioni e discussioni sono molto orientate all'implementazione, il che è difficile per chiunque non sia ancora all'avanguardia nel capire come usarlo come soluzione per i loro problemi.

Per questo motivo, la documentazione iniziale era scadente. C'erano alcune descrizioni su come usarlo, con il meglio dei contributori di terze parti. Al PyCon 2007 ho tenuto un discorso su "Using Stackless" che è andato abbastanza bene, secondo i numeri dell'indagine PyCon. Richard Tew ha svolto un ottimo lavoro raccogliendo questi, aggiornando stackless.com e mantenendo la distribuzione quando si presentano nuove versioni di Python. È un impiegato di CCP Games, sviluppatori di EVE Online, che utilizza Stackless come parte essenziale del proprio sistema di gioco.

I giochi CCP sono anche il più grande esempio di utilizzo del mondo reale quando parlano di Stackless. Il tutorial principale per Stackless è "Introduction to Concurrent Programming with Stackless Python" di Grant Olson, anch'esso orientato al gioco. Penso che ciò dia alla gente un'idea distorta del fatto che Stackless è orientato ai giochi, quando è più che i giochi sono più facilmente orientati alla continuazione.

Un'altra difficoltà è stato il codice sorgente.Nella sua forma originale richiedeva modifiche a molte parti di Python, il che rendeva Guido van Rossum, il capo di Python, diffidente. Parte del motivo, penso, era il supporto per call/cc che è stato in seguito rimosso come "troppo simile a supportare un goto quando ci sono forme migliori di livello superiore". Non sono sicuro di questa storia, quindi leggi questo paragrafo come "Stackless usato per richiedere troppe modifiche".

Le versioni successive non hanno richiesto le modifiche e Tismer ha continuato a spingere per l'inclusione in Python. Mentre c'era qualche considerazione, la posizione ufficiale (per quanto ne so) è che CPython non è solo un'implementazione Python ma è intesa come un'implementazione di riferimento, e non includerà la funzionalità Stackless perché non può essere implementata da Jython o Iron Python.

Non ci sono piani per "modifiche significative al codice". Quella citazione e il collegamento ipertestuale di riferimento da Arafangion (si veda il commento) risalgono a circa 2000/2001. I cambiamenti strutturali sono stati a lungo fatti, ed è ciò che ho menzionato sopra. Lo stackless com'è ora è stabile e maturo, con solo piccole modifiche alla base del codice negli ultimi anni.

Un'ultima limitazione con Stackless: non esiste un forte difensore per Stackless. Tismer è ora profondamente coinvolto con PyPy, che è un'implementazione di Python per Python. Ha implementato la funzionalità Stackless in PyPy e lo considera molto superiore allo stesso Stackless e ritiene che PyPy sia la via del futuro. Tew mantiene lo Stackless ma non è interessato alla difesa. Ho considerato di essere in quel ruolo, ma non vedevo come potevo ricavarne un reddito.

Anche se si desidera un allenamento in Stackless, sentirsi libero di contact me! :)

3

Mi interessa le risposte qui anche. Ho giocato un po 'con Stackless e sembra che sarebbe una buona aggiunta solida allo standard Python.

PEP 219 fa riferimento a potenziali difficoltà nel chiamare il codice Python dal codice C, se Python vuole passare a uno stack diverso. Ci dovrebbero essere modi per rilevare e prevenire questo (per evitare di cestinare lo stack C). Penso che questo sia trattabile, quindi mi chiedo anche perché Stackless deve stare da solo.

+3

PEP 219 è di 9 anni e seriamente fuori moda. La difficoltà di "chiamare il codice Python dal codice C" è solo nell'implementazione discussa in PEP e non è in Stackless. Il nome di PEP ("Stackless Python") è un po 'improprio; ha tratto ispirazione da Stackless e basta. –

4

Se ricordo male, Stackless era previsto per l'inclusione nel CPython ufficiale, ma l'autore di stackless ha detto ai cittadini di CPython di non farlo, perché aveva programmato di apportare alcune modifiche significative al codice base - presumibilmente voleva integrazione fatta più tardi quando il progetto era più maturo.

+1

Origine?Lo trovo interessante, ma ovviamente non posso crederti solo perché lo hai detto. Guarderei il pazzo se ti fossi sbagliato e ho iniziato a parlare di quanto fosse interessante. –

+2

Punto eccellente. Scusa se non ho il riferimento, perché era in una conversazione irc in #python su freenode, tuttavia sono riuscito a trovare un'antica conversazione sulla mailing list su http://gnosis.cx/download/charming_python_10_outtakes.html che dà molto più informazioni sulla situazione. – Arafangion

+0

Questo link è davvero eccezionale. Risponde a molte delle mie domande. –

34

ci è voluto molto tempo per trovare questa discussione. A quel tempo di non ero su PyPy ma avevo un rapporto di 2 anni con Psyco, finché la salute non lo fermò del tutto bruscamente. Ora sono di nuovo attivo e sto progettando un approccio alternativo - lo presenterò su EuroPython 2012.

La maggior parte delle dichiarazioni di Andrews sono corrette. Alcune aggiunte minori :

Stackless era significativamente più veloce di CPython, 10 anni fa, perché ottimizzavo il ciclo dell'interprete. A quel tempo, Guido non era pronto per quello. Pochi anni dopo, le persone hanno fatto ottimizzazioni simili e anche migliori e migliori, il che rende Stackless un po 'più lento, come previsto.

In inclusione: beh, all'inizio ero molto invadente e convinto che Stackless è la strada da percorrere. Successivamente, quando è stato quasi possibile inserirmi, ho perso interesse e ho preferito lasciare in questo modo, parzialmente per la frustrazione, in parte per mantenere il controllo di Stackless.

Gli argomenti come "altre implementazioni non possono farlo" mi sono sempre sembrato zoppo, in quanto vi sono altri esempi in cui questa argomentazione potrebbe anche essere utilizzata. Pensavo che avrei dovuto dimenticarmene e rimanere in buona amicizia con Guido, avendo la mia distro.

Nel frattempo le cose stanno cambiando di nuovo. Sto lavorando su PyPy e Stackless come estensione Ne parleranno che a volte in seguito

Cheers - Chris

+0

Grazie per l'intuizione, Chris. :) –