[Python] "Go or Unladen Swallow? " Cosa ne pensate ?
Manlio Perillo
manlio_perillo a libero.it
Mer 11 Nov 2009 18:25:08 CET
luigi scarso ha scritto:
> [...]
>> Purtroppo sono ancora alla ricerca di un linguaggio tra C e Python, e ne
>> Haskell, ne OCaml ne Erlang non mi sembrano adeguati.
> lua+C ?
> [...]
Non mi sembra che si guadagni molto in prestazioni e, soprattutto, a
livello di astrazioni.
Per me il livello di astrazione è molto importante, perchè di solito
significa maggiori possibilità di riuscire a scrivere codice *veramente*
riutilizzabile.
Python ha dalla sua la dinamicità e costrutti potenti come i generatori.
Ma anche Haskell è molto interessante da questo punto di vista.
Il "problema" di Python è che spesso i vari "building block" te li devi
scrivere in C.
Vedi ad esempio numpy.
Di solito ti va bene, ma non è detto che i vari "blocchi" facciano
sempre al caso tuo: vedi sempre numpy che, se ricordo bene, implementa
una funzione per cercare un elemento all'interno di un array *solo* se
questo è ordinato (perchè in questo caso l'implementazione è più
efficiente).
Giusto per fare un esempio banale, qui ci sono diverse implementazioni,
in Python ed Haskell, di controllo di un elemento all'interno di una
sequenza **lazy**.
# nums.py: Python, versione che usa xrange:
http://paste.pocoo.org/show/150006/
# nums-pure.py: Python, versione che usa un generatore esplicito:
http://paste.pocoo.org/show/150007/
# nums.hs: Haskell
http://paste.pocoo.org/show/150008/
In Haskell, [a..b] è solo zucchero sintattico, non è un "builtin".
Ecco una versione con codice esplicito:
# nums-pure.hs
http://paste.pocoo.org/show/150009/
Per i tempi ho usato la funzione `time` di bash.
Il codice Haskell è stato compilato con
`ghc -O2 --make nums.hs`
Gli script Python sono stati precompilati (ma non è necessario).
# nums.py
real 0m4.745s
user 0m4.620s
sys 0m0.004s
# nums-pure.py
real 0m30.321s
user 0m29.842s
sys 0m0.032s
Come si vede c'è una differenza abissale.
Per quanto riguarda Haskell:
# nums.hs
real 0m2.533s
user 0m2.448s
sys 0m0.020s
# nums-pure.hs
real 0m2.673s
user 0m2.584s
sys 0m0.004s
La versione Python occupa 2476 KB, quella Haskell 1344 KB (ma sono
valori indicativi).
La versione Haskell è più efficente probabilmente perchè può gestire gli
interi nativi della CPU.
Le prestazioni nella gestione della sequenza lazy sono molto simili.
Quello che sto cercando è un linguaggio di livello non troppo lontano da
Python, ma efficiente.
Haskell ed Ocaml si avvicinano, ma hanno diversi problemi purtroppo.
Ciao Manlio
Maggiori informazioni sulla lista
Python