Charles_Stain
moderatore
python sapiens sapiens
Collegato
Messaggi: 1095
|
 |
« inserito:: Dicembre 15, 2008, 14:12 » |
|
Vi rimando al post del mio blog: http://alfredodinapoli.wordpress.comAndateci se siete curiosi di sapere come si comporta il Python! Ciao! Alfredo
|
|
|
|
|
Registrato
|
 "Ogni volta che viene usata una global, un programmatore muore-"
|
|
|
Riovandaino
python habilis

Scollegato
Messaggi: 61
#!/usr/bin/python
|
 |
« Risposta #1 inserito:: Dicembre 15, 2008, 15:48 » |
|
Lasciando perdere il C che essendo compilato è indubbiamente più rapido, non sono d'accordo con le tue considerazioni in merito a Python e Java. La virtual machine di Java infatti ha un'architettura JIT che traduce il bytecode in codice macchina in fase di run-time. Nell'avvio dell'applicazione questo processo forse rallenta un attimo il programma, ma poi in fase di esecuzione ( sopratutto con programmi un po' più impegnativi del tuo algoritmo di ordinamento ) comporta un guadagno notevole. A supporto della mia tesi ho fatto un piccolo esperimento simile al tuo, solo che al posto di un algoritmo di ordinamento ho fatto calcolare a due programmi Java e Python (ovviamente identici a livello di algoritmo ) i numeri primi da 2 a 100000. Ecco i codici: Java: class prime {
public static void main(String[] args) { int c = 0; for(int i=2;i<=100000;i++) if (isprime(i)) c++; System.out.println(c); }
static boolean isprime(int n) { if (n == 2) return true; else if (n % 2 == 0) return false; else { for(int i=3;i<=(int)n/2;i+=2) if (n % i == 0) return false; return true ; } } } Python: def isprime(n): if n == 2: return True elif n % 2 == 0: return False else: for i in range(3,int(n/2)+1,2): if n % i == 0: return False return True
c = 0 for i in range(2,100000): if isprime(i): c += 1 print c Ed ecco i tempi di esecuzione: dario@ubuntu:~$ time java prime 9592
real 0m1.662s user 0m1.368s sys 0m0.052s dario@ubuntu:~$ time python prime.py 9592
real 0m51.562s user 0m48.611s sys 0m0.200s
Come previsto Java stravince 
|
|
|
|
« Ultima modifica: Dicembre 15, 2008, 15:51 da Riovandaino »
|
Registrato
|
-----BEGIN GEEK CODE BLOCK----- Version: 3.12 GCS/GO d- s: a--- C++>$ P L+++ E-- W+ N? o? K? w---@ !O !M !V PS+++ PE- Y !PGP t 5? X R(+) tv+ b++(++++) !DI !D G e- h! r !z ------END GEEK CODE BLOCK------
|
|
|
Markon
moderatore
python sapiens sapiens
Scollegato
Messaggi: 2856
|
 |
« Risposta #2 inserito:: Dicembre 15, 2008, 16:24 » |
|
|
|
|
|
|
Registrato
|
My Guitar wants to Kill you Mama!
|
|
|
|
Flame_Alchemist
|
 |
« Risposta #3 inserito:: Dicembre 15, 2008, 16:56 » |
|
there are lies, damned lies, and benchmarks.
Non si può paragonare il tempo che impiega un linguaggio compilato come java con il tempo che impiega un linguaggio come python. Se si sommasse il tempo di compilazione ed il tempo di esecuzione di java probabilmente python sarebbe molto più veloce. I linguaggi di scripting hanno come fine principale il permettere di provare prima (il famoso experiment faster, fail faster). Se proprio si volesse fare un benchmark si deve ottimizzare il più possibile ogni codice. Il metodo che hai postato non è di certo il più veloce (sto parlando dei numeri primi), inoltre fai un paio di check inutili (o che si possono eliminare semplicemente cambiando un po' la struttura del programma), e usi xrange al posto di range (che in python < 3, produce una sensibile differenza, specie in intervalli così grandi). Sistemando il codice java introducendo le stesse ottimizzazioni si velocizza? Ho fatto un paio di prove e mi sembra di no, almeno non in maniera confortante. Togliendo uno 0 all'intervallo (non ho molto tempo, quindi ho diminuito) e mettendo le ottimizzazioni sopra descritte il tempo scende da qualche secondo a 0.43, poi a 0.015 mettendo anche xrange. Mentre in java dopo 31 millisecondi iniziali, con qualche ottimizzazione sono passato a 47, cambiando leggermente il ciclo FOR sono di nuovo sceso a 31.
EDIT: Sistemati alcuni errori di grammatica, semantici, e chi più ne ha più ne metta (ero leggermente di fretta, quindi può succedere...)
|
|
|
|
« Ultima modifica: Dicembre 15, 2008, 19:03 da Flame_Alchemist »
|
Registrato
|
|
|
|
Charles_Stain
moderatore
python sapiens sapiens
Collegato
Messaggi: 1095
|
 |
« Risposta #4 inserito:: Dicembre 15, 2008, 17:32 » |
|
Sono felice di aver dato vita ad un dibattito  Ora sono un pò di fretta, stasera quando ho tempo guardo il codice di Riovandaino e le modifiche suggerite da Flame e poi posto  Una cosa è certa, non si può etichettare un linguaggio come più veloce di un altro sulla base di un semplice programma, casomai un pool.. e poi confrontarsi e vedere se queste differenze sono sensibili.. Ad ogni modo il mio era più un esperimento curioso che una condanna, perchè ognuno ha i suoi gusti e penso che non basti un benchmark per convincere uno Javista/Pythone convinto a cambiare il suo linguaggio  Ciao! Alfredo
|
|
|
|
|
Registrato
|
 "Ogni volta che viene usata una global, un programmatore muore-"
|
|
|
Markon
moderatore
python sapiens sapiens
Scollegato
Messaggi: 2856
|
 |
« Risposta #5 inserito:: Dicembre 15, 2008, 19:49 » |
|
penso che non basti un benchmark per convincere uno Javista/Pythone convinto a cambiare il suo linguaggio Mah, se vuoi considerare un benchmark, a questo punto programmi in assembler, visto che ottieni una velocità sicuramente maggiore. Ognuno programma come gli pare.
|
|
|
|
|
Registrato
|
My Guitar wants to Kill you Mama!
|
|
|
Charles_Stain
moderatore
python sapiens sapiens
Collegato
Messaggi: 1095
|
 |
« Risposta #6 inserito:: Dicembre 15, 2008, 20:40 » |
|
penso che non basti un benchmark per convincere uno Javista/Pythone convinto a cambiare il suo linguaggio Mah, se vuoi considerare un benchmark, a questo punto programmi in assembler, visto che ottieni una velocità sicuramente maggiore. Ognuno programma come gli pare. Non volevo dire questo =__= volevo solo dire che se a una persona piace un linguaggio, non sarà certo una qualsiasi cosa del tipo "il tuo linguaggio X è peggio di questo Y per questi Z motivi" a fargli cambiare idea. Uno programma come gli pari, appunto. Ciao Alfredo
|
|
|
|
|
Registrato
|
 "Ogni volta che viene usata una global, un programmatore muore-"
|
|
|
Riovandaino
python habilis

Scollegato
Messaggi: 61
#!/usr/bin/python
|
 |
« Risposta #7 inserito:: Dicembre 15, 2008, 20:49 » |
|
there are lies, damned lies, and benchmarks.
Non si può paragonare il tempo che impiega un linguaggio compilato come java con il tempo che impiega un linguaggio come python. Se si sommasse il tempo di compilazione ed il tempo di esecuzione di java probabilmente python sarebbe molto più veloce.
Prima di tutto Java è un linguaggio pseudo-compilato. In secondo luogo seguendo il tuo ragionamento il Python sarebbe anche più veloce del C o di qualsiasi linguaggio compilato, invece a noi interessano solo i tempi di esecuzione. Se proprio si volesse fare un benchmark si deve ottimizzare il più possibile ogni codice. Il metodo che hai postato non è di certo il più veloce (sto parlando dei numeri primi), inoltre fai un paio di check inutili (o che si possono eliminare semplicemente cambiando un po' la struttura del programma), e usi xrange al posto di range (che in python < 3, produce una sensibile differenza, specie in intervalli così grandi). Sistemando il codice java introducendo le stesse ottimizzazioni si velocizza? Ho fatto un paio di prove e mi sembra di no, almeno non in maniera confortante.
L'importante è utilizzare un algoritmo identico. In ogni caso anche con xrange non noto questa grande differenza che dici tu: dario@ubuntu:~$ time java prime 9592
real 0m1.583s user 0m1.368s sys 0m0.028s dario@ubuntu:~$ time python prime.py 9592
real 0m30.797s user 0m29.554s sys 0m0.028s
La differenza di velocità tra python e java sta nel fatto che quest'ultimo dopo un breve ritardo inziale dovuto alla compilazione del bytecode viaggia praticamente alla velocità di un linguaggio compilato. Python no, quindi è più lento.
|
|
|
|
« Ultima modifica: Dicembre 15, 2008, 20:51 da Riovandaino »
|
Registrato
|
-----BEGIN GEEK CODE BLOCK----- Version: 3.12 GCS/GO d- s: a--- C++>$ P L+++ E-- W+ N? o? K? w---@ !O !M !V PS+++ PE- Y !PGP t 5? X R(+) tv+ b++(++++) !DI !D G e- h! r !z ------END GEEK CODE BLOCK------
|
|
|
Charles_Stain
moderatore
python sapiens sapiens
Collegato
Messaggi: 1095
|
 |
« Risposta #8 inserito:: Dicembre 15, 2008, 21:26 » |
|
Vado un secondo OT ma neanche tanto.. navigando in rete ho trovato un modulo chiamato psyco che decanta la possibilità di rendere il python molto più veloce.. qualcuno lo ha provato? Casomai se è valido ci getto un occhio e vi faccio sapere!
EDIT: Ecco cosa si ottiene con il modulo psyco!
src alfredo$ time python prime2.py 9592
real 0m1.938s user 0m1.814s sys 0m0.027s
Una bella differenza no? Ciao! Alfredo
|
|
|
|
« Ultima modifica: Dicembre 15, 2008, 21:41 da Charles_Stain »
|
Registrato
|
 "Ogni volta che viene usata una global, un programmatore muore-"
|
|
|
Riovandaino
python habilis

Scollegato
Messaggi: 61
#!/usr/bin/python
|
 |
« Risposta #9 inserito:: Dicembre 15, 2008, 21:28 » |
|
Vado un secondo OT ma neanche tanto.. navigando in rete ho trovato un modulo chiamato psyco che decanta la possibilità di rendere il python molto più veloce.. qualcuno lo ha provato? Casomai se è valido ci getto un occhio e vi faccio sapere!
Psyco è un tentativo di implementare un just in time compiler per python. Il guadagno di velocità effettivamente c'è sopratutto per applicazioni che devono compiere calcoli matematici molto intensi.
|
|
|
|
|
Registrato
|
-----BEGIN GEEK CODE BLOCK----- Version: 3.12 GCS/GO d- s: a--- C++>$ P L+++ E-- W+ N? o? K? w---@ !O !M !V PS+++ PE- Y !PGP t 5? X R(+) tv+ b++(++++) !DI !D G e- h! r !z ------END GEEK CODE BLOCK------
|
|
|
|
billiejoex
|
 |
« Risposta #10 inserito:: Dicembre 19, 2008, 21:19 » |
|
Vado un secondo OT ma neanche tanto.. navigando in rete ho trovato un modulo chiamato psyco che decanta la possibilità di rendere il python molto più veloce.. qualcuno lo ha provato? Casomai se è valido ci getto un occhio e vi faccio sapere!
EDIT: Ecco cosa si ottiene con il modulo psyco!
src alfredo$ time python prime2.py 9592
real 0m1.938s user 0m1.814s sys 0m0.027s
Una bella differenza no? Ciao! Alfredo
Psyco torna utile solo nell'ottimizzazione di algoritmi. Qualitativamente non è paragonabile al JIT di Java (che di fatto è cmq una cosa profondamente diversa da Psyco). Riguardo i benchmark Java/Python (puro) purtroppo il primo vince di diverse lunghezze.
|
|
|
|
|
Registrato
|
|
|
|
|
imbuto
|
 |
« Risposta #11 inserito:: Febbraio 16, 2009, 22:32 » |
|
Per pura curiosità ho provato a vedere cosa succede in Python creando un'estensione in C e confrontandola con C. #include <stdio.h> int main(int argc, char argv[]){ int c = 0; int i; for(i=2;i<=100000;i++) if (isprime(i)) c++; printf("%d\n", c); }
int isprime(long n) { long i; if (n == 2) return 1; else if (n % 2 == 0) return 0; else { for(i=3;i<=(long)n/2;i+=2) if (n % i == 0) return 0; return 1 ; } }
from isprime import isprime c = 0 for i in range(2,100000): if isprime(i): c += 1 print c
Ecco il risultato: C: $ time ./prime 9592
real 0m0.905s user 0m0.904s sys 0m0.000s
Python/C: $ time python prime.py 9592
real 0m0.961s user 0m0.952s sys 0m0.008s
Non male. Mi aspettavo sì un buon risultato ma credevo che importare isprime fosse più dispedioso. Usare Python e tradurre in C o C++ i colli di bottiglia non è poi così male.
|
|
|
|
« Ultima modifica: Febbraio 16, 2009, 22:37 da imbuto »
|
Registrato
|
|
|
|
Charles_Stain
moderatore
python sapiens sapiens
Collegato
Messaggi: 1095
|
 |
« Risposta #12 inserito:: Febbraio 17, 2009, 08:06 » |
|
Bhè io di questo linguaggio adoro la sua versatilità, e questo ne è esempio  Ciao! Alfredo 
|
|
|
|
|
Registrato
|
 "Ogni volta che viene usata una global, un programmatore muore-"
|
|
|
|
~FullSyst3m~
|
 |
« Risposta #13 inserito:: Marzo 07, 2009, 10:13 » |
|
Quindi per scrivere un estensione per Python basta scriverla e poi importarla semplicemente?
|
|
|
|
|
Registrato
|
|
|
|
Markon
moderatore
python sapiens sapiens
Scollegato
Messaggi: 2856
|
 |
« Risposta #14 inserito:: Marzo 07, 2009, 10:25 » |
|
Quindi per scrivere un estensione per Python basta scriverla e poi importarla semplicemente? Purtroppo no, anche se sarebbe veramente il massimo. 1) Devi conoscere il C 2) Devi usare le API Python/C per creare il nuovo modulo e per dire quali funzioni/strutture/oggetti includere nel modulo. 3) Creare il modulo C-Python compilandolo (magari con distutils)
|
|
|
|
|
Registrato
|
My Guitar wants to Kill you Mama!
|
|
|
|