Python 3.1 e le prestazioni mancanti

Questa mattina stavo rivedendo lo script che ho postato ieri. L’ho ottimizzato un po’ e ho tolto una 30-ina di righe. Dopodiché mi sono messo a fare alcuni test prestazionali provando ad addestrare una rete di circa 5000 neuroni disposti in vari modi (da 3 strati da 2000 fino a 250 strati da 20).

Le prestazioni non erano mozzafiato e questo lo sapevo già, il python non è il linguaggio più indicato per applicazioni fortemente CPU bound.

Tuttavia la sorpresa l’ho avuta quando ho testato lo script con la nuova versione di Python (la 3.1) e costatando una diminuzione delle prestazioni di circa il 50%.

Cinquantapercento! Mica bruscolini!

Ho rifatto il conto con vari test (sempre utilizzando il mio script) e il risultato era sempre di questa entità. Le cose sono due:

  1. L’interprete di python3.1 è proprio più lento di suo. In questo caso il problema verrà fuori quando si passerà definitivamente da 2.6 a 3.
  2. Alcune funzioni che nella 2.6 vanno a meraviglia nella 3.1 fanno schifo. In questo caso la cosiddetta migrazione da 2.6 a 3 potrebbe essere meno facile del previsto.

In attesa  di risposte vi chiedo se voi sapete qualcosa di più al riguardo. Se volete poi posso fornire altri dettagli sui vari test.

UPDATE 19/07/10

Ho ripetuto i test su un’altra distribuzione (sidux) e questa volta i risultati sono un po’ diversi. La versione 3 di python è sempre più lenta ma in percentuali accettabili (5% circa).

Inoltre ho provato anche con psyco ottimizzando del 75% le prestazioni del programma.

9 comments on “Python 3.1 e le prestazioni mancanti

  1. Da dove provengono entrambe le installazioni? Le hai compilate a mano o erano precompilate?

    In fine, cosa più importante, sei sicuro che entrambe le versioni binarie fossero state compilate con gli stessi flags di ottimizzazione (Python usa -O2 se non ricordo male), di architettura (-march=…), ecc ?

    • Purtroppo questa piccola nota l’ho potuta verificare solo sul mio portatile di emergenza. Le due versioni di python in questione sono la 2.6 installate di default e la 3.1 installata dai medesimi repository ufficiali di OpenSuse. Quindi credo che siano stati entrambi compilati nelle medesime condizioni.

      Sfortunatamente su OpenSuse non mi muovo con la stessa leggiadria di Debian quindi non ho potuto fare controlli più invasivi.

      Appena mi aggiustano l’aria condizionata a casa mi metto a fare qualche benchmark più “professionale” con il PC “ufficiale”.

      Da notare, inoltre, che il flag che dovrebbe ottimizzare il bytecode (-O) invece di renderlo più prestante lo rallenta. O_O

      Bah… xD

  2. Ciao,
    forse dico una castroneria, o non sono aggiornato, ma quando ho letto la documentazione di python ricordo che fino alla versione 2.6 il flag di ottimizzazione non facesse altro che eliminare le istruzioni assert dallo pseudocompilato .pyo. Con un doppio flag (-OO) eliminava inoltre tutte le stringhe __doc__.

    Che rallenti dopo l’uso del flag è perlomeno curioso ?_?
    Con entrambi gli interpreti succede questo?

    • Ma infatti è quello che sapevo anche io. Per questo mi sembra strano… ora provo a fare altri test con altre distribuzioni.

  3. Mi ricordo comunque che esiste psyco, una sorta di compilatore JIT per python, alla maniera di Java.

    • Lo conosco. Sto provando anche Shedskin che compila i programmi in python in c++ ma per ora è ancora troppo sperimentale.

  4. Comunque ho provato anch’io con il 2.6, 2.7 e il 3.0 sulla mia macchina e confermo, le 2.x differiscono di meno di un secondo, la 3.0 quasi 10 sec in più.
    Piacere comunque, scusa non mi sono presentato, mi chiamo Daniele, seguo da molto il tuo blog ma non avevo mai commentato nulla :-).

    • La 3.1 è più lenta delle precedenti. Dato che è il linguaggio di scripting ufficiale di google penso che qualche bell’aiuto prima del passaggio definitivo alla 3 verrà fatto. 😀

  5. Io ho trovato molto più efficace usare cython per le funzioni più lente e più chiamate. 10x più veloce rispetto allo stesso codice ottimizzato con psyco.