Python-it.org forum # share your knowledge! ;)
Febbraio 09, 2010, 07:43 *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizie: Tutorial Django gratuito, in italiano!: http://www.python-it.org/09/09/14/tutorial-django-gratuito-in-italiano
 
   Home   Guida Regolamento Ricerca Accedi Registrati Python-it.org Doc  
Apri il forum in una pagina a parte - È possibile fornire/richiedere supporto anche presso i canali IRC #python su Azzurra e #python.it su Freenode

Pagine: [1] 2 3   Vai giù
  Stampa  
Autore Discussione: C vs Python vs Java: Risultato di un esperimento  (Letto 2544 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
Charles_Stain
moderatore
python sapiens sapiens
*
Collegato Collegato

Messaggi: 1095



Mostra profilo WWW
« inserito:: Dicembre 15, 2008, 14:12 »

Vi rimando al post del mio blog:

http://alfredodinapoli.wordpress.com

Andateci 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 Scollegato

Messaggi: 61


#!/usr/bin/python


Mostra profilo
« 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:

Codice:
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:

Codice:
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  wink
« 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 Scollegato

Messaggi: 2856



Mostra profilo WWW
« Risposta #2 inserito:: Dicembre 15, 2008, 16:24 »

Per un benchmark completo, guardate qui:

http://www.pythonmark.com/it/2008/09/08/python-benchmarks-comparison/

Bye
Registrato

My Guitar wants to Kill you Mama!
Flame_Alchemist
python neanderthalensis
****
Scollegato Scollegato

Messaggi: 495



Mostra profilo WWW
« 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 Collegato

Messaggi: 1095



Mostra profilo WWW
« Risposta #4 inserito:: Dicembre 15, 2008, 17:32 »

Sono felice di aver dato vita ad un dibattito ahahah
Ora sono un pò di fretta, stasera quando ho tempo guardo il codice di Riovandaino e le modifiche suggerite da Flame e poi posto linguaccia
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 ahahah
Ciao!
Alfredo
Registrato



"Ogni volta che viene usata una global, un programmatore muore-"
Markon
moderatore
python sapiens sapiens
*
Scollegato Scollegato

Messaggi: 2856



Mostra profilo WWW
« Risposta #5 inserito:: Dicembre 15, 2008, 19:49 »

Citazione
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 Collegato

Messaggi: 1095



Mostra profilo WWW
« Risposta #6 inserito:: Dicembre 15, 2008, 20:40 »

Citazione
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 Scollegato

Messaggi: 61


#!/usr/bin/python


Mostra profilo
« 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:

Codice:
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 Collegato

Messaggi: 1095



Mostra profilo WWW
« 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 Scollegato

Messaggi: 61


#!/usr/bin/python


Mostra profilo
« 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
python neanderthalensis
****
Scollegato Scollegato

Messaggi: 359


Mostra profilo
« 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

Python FTP server library:
http://code.google.com/p/pyftpdlib/
imbuto
python habilis
**
Scollegato Scollegato

Messaggi: 63


Mostra profilo
« 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.
Codice:
#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 ;
        }
}

Codice:
from isprime import isprime
c = 0
for i in range(2,100000):
    if isprime(i): c += 1
print c
Ecco il risultato:

C:
Codice:
$ time ./prime
9592

real 0m0.905s
user 0m0.904s
sys 0m0.000s

Python/C:
Codice:
$ 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 Collegato

Messaggi: 1095



Mostra profilo WWW
« Risposta #12 inserito:: Febbraio 17, 2009, 08:06 »

Bhè io di questo linguaggio adoro la sua versatilità, e questo ne è esempio wink
Ciao!
Alfredo  Python
Registrato



"Ogni volta che viene usata una global, un programmatore muore-"
~FullSyst3m~
python sapiens
*****
Scollegato Scollegato

Messaggi: 971



Mostra profilo
« 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 Scollegato

Messaggi: 2856



Mostra profilo WWW
« Risposta #14 inserito:: Marzo 07, 2009, 10:25 »

Citazione
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!
Pagine: [1] 2 3   Vai su
  Stampa  
 
Vai a:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.11 | SMF © 2006-2009, Simple Machines LLC XHTML 1.0 valido! CSS valido!