[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