Sida 1 av 1

[LÖST]Snabbheten i python och java?

Postat: 12 jun 2007, 23:27
av Galgalid
Jag vet att olika språk är olika snabba, och att C++ är typ det snabbaste, medans Java och Python är långsammare.
Vilket är snabbast av Java och Python? Är skillnaden mätbar i sekunder?
Hur stor är skillnaden i snabbhet mellan Python och C++?
Java och C++?

Har gått och funderat på detta länge nu ;)

SV: Snabbheten i python och java?

Postat: 12 jun 2007, 23:48
av Okänd
Du kan inte mäta skillnaden i sekunder på lång vägar.

_Allt_ handlar om pass snabb kod _du_ skriver.

Om du skriver en 3d motor eller ett realtidssystem så kanske du bör välja ett språk där du tjänar lite på att ha ett så kallat "snabbt" språk (Assembly, C, Fortran, C++). Men program du gör kommer aldrig bli snabbare än koden du skriver själv. Så det gäller att implementera algoritmerna på ett effektivt sätt.

Anledning till att Python och Java kallas för långsamma språk är därför dom inte kompileras till maskinkod, utan exekveras genom en tolk, eller i javas fall i en VM.
Detta lägger ju till lite overhead. Men om du inte gör något extremt krävande program så kommer du inte att märka skillnaden.

SV: Snabbheten i python och java?

Postat: 13 jun 2007, 00:00
av Galgalid
ok coolt. Tackar tackar ^^

SV: [LÖST]Snabbheten i python och java?

Postat: 13 jun 2007, 00:11
av Okänd
Bara för skojs skulle så gjorde jag ett 3 benchmark program:

Alla program kör 255 iterationer och skriver ut en rad på STDOUT


Här är resultatet, men resultatet är dock _väldigt_ ojämnt. Eftersom tidtagningen inte är så noggran, samt att det cachening osv gör att resultaten varieras mycket mellan olika körningar.
För att ta tid på ett program så använder man time, te.x. time ./a.out
Men det man kan se här är att java & python tar lite mer tid på sig, detta är eftersom dom måste starta upp tolken / VM:n.
Java:

Kod: Markera allt

Time spent in user mode   (CPU seconds) : 0.120s
Time spent in kernel mode (CPU seconds) : 0.036s
Total time                              : 0:00.15s
Python:

Kod: Markera allt

Time spent in user mode   (CPU seconds) : 0.012s
Time spent in kernel mode (CPU seconds) : 0.008s
Total time                              : 0:00.02s
C:

Kod: Markera allt

Time spent in user mode   (CPU seconds) : 0.000s
Time spent in kernel mode (CPU seconds) : 0.000s
Total time                              : 0:00.00s

Här är källkoden:

C

Kod: Markera allt

#include <stdio.h>

int main(int argc, char **argv) {
   unsigned char a;

   for(a = 1; a != 0; a++) 
      printf("a :%d\n", a);

   return 0;
}

Java

Kod: Markera allt

import java.io.*;

public class loop {

   static public void main(String[] args) {
      byte a;

      for(a = 1; a != 0; a++)
         System.out.println("a: " + a); 
   }
}


Python

Kod: Markera allt

#!/usr/bin/python

a = 1

while a <= 255:
        print "a:" + `a` 
        a = a + 1

SV: [LÖST]Snabbheten i python och java?

Postat: 13 jun 2007, 00:44
av Galgalid
coolt ^^ 

SV: [LÖST]Snabbheten i python och java?

Postat: 13 jun 2007, 17:30
av Smygis
Och för att vidare strycka detta så tyckte jag att gasols Pythonprogram såg väldigt ickeoptimerat ut.

Kod: Markera allt

#!/usr/bin/env python

for a in xrange(1, 256):
	print "a:%d" % (a)
är i snitt 30% snabbare för mig.

SV: [LÖST]Snabbheten i python och java?

Postat: 13 jun 2007, 23:51
av Okänd
Smygis skrev: Och för att vidare strycka detta så tyckte jag att gasols Pythonprogram såg väldigt ickeoptimerat ut.

Kod: Markera allt

#!/usr/bin/env python

for a in xrange(1, 256):
	print "a:%d" % (a)
är i snitt 30% snabbare för mig.
Ah jag är ingen python programmerar och jag påstår mig inte vara en. Men det exempelet tycks bara visa på att python tolken är dålig på att optimera kod.

Premature optimizations is the root to all evil.

Det är algoritmerna som ska effektiviseras, hur koden översätts till maskikod / tolkas på ett bra sätt det ska kompilatorn / tolken lista ut åt mig ( -O till gcc ), annars så skulle jag ju lika gärna kunna gå tillbaka och programmera assembly.

SV: [LÖST]Snabbheten i python och java?

Postat: 14 jun 2007, 00:04
av Smygis
gasol skrev:
Smygis skrev: Och för att vidare strycka detta så tyckte jag att gasols Pythonprogram såg väldigt ickeoptimerat ut.

Kod: Markera allt

#!/usr/bin/env python

for a in xrange(1, 256):
	print "a:%d" % (a)
är i snitt 30% snabbare för mig.
Ah jag är ingen python programmerar och jag påstår mig inte vara en. Men det exempelet tycks bara visa på att python tolken är dålig på att optimera kod.

Premature optimizations is the root to all evil.

Det är algoritmerna som ska effektiviseras, hur koden översätts till maskikod / tolkas på ett bra sätt det ska kompilatorn / tolken lista ut åt mig ( -O till gcc ), annars så skulle jag ju lika gärna kunna gå tillbaka och programmera assembly.
Nejdu, Hur mycket man önskar så kan den nog inte förvandla en vanlig while-loop till en iterering över en generator.

Och det är lite av en utmaning att bestämma hur man ska göra, I vissa fall så är while-loopen att föredra. Till skillnad från C då for-loopen helt enkelt är en kompaktare while-loop så är while-loopen och for-loopen i Python två helt skilda saker som fungerar på helt olika sätt.

SV: [LÖST]Snabbheten i python och java?

Postat: 14 jun 2007, 00:36
av Galgalid
Du kan dina saker du ;)

SV: [LÖST]Snabbheten i python och java?

Postat: 14 jun 2007, 01:28
av Okänd
Smygis skrev:
gasol skrev:
Smygis skrev: Och för att vidare strycka detta så tyckte jag att gasols Pythonprogram såg väldigt ickeoptimerat ut.

Kod: Markera allt

#!/usr/bin/env python

for a in xrange(1, 256):
	print "a:%d" % (a)
är i snitt 30% snabbare för mig.
Ah jag är ingen python programmerar och jag påstår mig inte vara en. Men det exempelet tycks bara visa på att python tolken är dålig på att optimera kod.

Premature optimizations is the root to all evil.

Det är algoritmerna som ska effektiviseras, hur koden översätts till maskikod / tolkas på ett bra sätt det ska kompilatorn / tolken lista ut åt mig ( -O till gcc ), annars så skulle jag ju lika gärna kunna gå tillbaka och programmera assembly.
Nejdu, Hur mycket man önskar så kan den nog inte förvandla en vanlig while-loop till en iterering över en generator.

Och det är lite av en utmaning att bestämma hur man ska göra, I vissa fall så är while-loopen att föredra. Till skillnad från C då for-loopen helt enkelt är en kompaktare while-loop så är while-loopen och for-loopen i Python två helt skilda saker som fungerar på helt olika sätt.
Intresant går det på nåt sätt att generera maskinkod från python tolken, som visar på skillnaden?


Om jag Skriver om loopen i  C programmet till dessa:

Kod: Markera allt

 
   a = 0;
   for(; ++a; )
      printf("a :%d\n", a);

Kod: Markera allt

    a = 0;
   while(++a )
      printf("a :%d\n", a);
Så genereras exakt samma x86 assembly kod, men, hur fungerar for loopen i Python då? Är det nån inbyggd iterator över en vektor med talen 0-255? För isf kommer du ju att allokera minne för 256 byte för att sedan adressera värden därifrån?

SV: [LÖST]Snabbheten i python och java?

Postat: 14 jun 2007, 02:26
av Smygis
while loopen i python är precis som alla andra while loopar

while (statement is true):

Men for loopen därimot

for variable in sequence:

kan man läsa ut som:

for each element in sequence:

lite visning:

Kod: Markera allt

>>> for v in ["Hej", 19, 3.14, "Det är mitt i natten"]:
...     print "v är: %s" % (v)
... 
v är: Hej
v är: 19
v är: 3.14
v är: Det är mitt i natten
Och xrange är ett generator objekt som genererar en talsekvens mellan angivna tal. Till skillnad mot range som returnerar en lista med tal i.

>>> xrange(10)
xrange(10)
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

I en for loop gör dem samma sak men xrange är snabbare/mer snäll mot minnet.

SV: [LÖST]Snabbheten i python och java?

Postat: 14 jun 2007, 03:30
av Okänd
Smygis skrev: while loopen i python är precis som alla andra while loopar

while (statement is true):

Men for loopen därimot

for variable in sequence:

kan man läsa ut som:

for each element in sequence:

lite visning:

Kod: Markera allt

>>> for v in ["Hej", 19, 3.14, "Det är mitt i natten"]:
...     print "v är: %s" % (v)
... 
v är: Hej
v är: 19
v är: 3.14
v är: Det är mitt i natten
Och xrange är ett generator objekt som genererar en talsekvens mellan angivna tal. Till skillnad mot range som returnerar en lista med tal i.

>>> xrange(10)
xrange(10)
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

I en for loop gör dem samma sak men xrange är snabbare/mer snäll mot minnet.
Ah den är mycket lik Javas for each loop isf.