[LÖST]Snabbheten i python och java?

Här diskuteras programmering och utveckling
Användarvisningsbild
Galgalid
Inlägg: 1646
Blev medlem: 08 dec 2006, 12:30

[LÖST]Snabbheten i python och java?

Inlägg 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 ;)
Senast redigerad av 1 Galgalid, redigerad totalt 13 gånger.
Okänd
Inlägg: 30172
Blev medlem: 03 mar 2008, 01:30
OS: Ubuntu

SV: Snabbheten i python och java?

Inlägg 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.
Senast redigerad av 1 gasol, redigerad totalt 12 gånger.
Användarvisningsbild
Galgalid
Inlägg: 1646
Blev medlem: 08 dec 2006, 12:30

SV: Snabbheten i python och java?

Inlägg av Galgalid »

ok coolt. Tackar tackar ^^
Okänd
Inlägg: 30172
Blev medlem: 03 mar 2008, 01:30
OS: Ubuntu

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

Inlägg 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
Användarvisningsbild
Galgalid
Inlägg: 1646
Blev medlem: 08 dec 2006, 12:30

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

Inlägg av Galgalid »

coolt ^^ 
Användarvisningsbild
Smygis
Inlägg: 849
Blev medlem: 21 jun 2006, 18:41
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Kramfors

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

Inlägg 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.
A Foolish Consistency is the Hobgoblin of Little Minds.Beware: In C++, your friends can see your privates!
Okänd
Inlägg: 30172
Blev medlem: 03 mar 2008, 01:30
OS: Ubuntu

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

Inlägg 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.
Användarvisningsbild
Smygis
Inlägg: 849
Blev medlem: 21 jun 2006, 18:41
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Kramfors

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

Inlägg 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.
A Foolish Consistency is the Hobgoblin of Little Minds.Beware: In C++, your friends can see your privates!
Användarvisningsbild
Galgalid
Inlägg: 1646
Blev medlem: 08 dec 2006, 12:30

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

Inlägg av Galgalid »

Du kan dina saker du ;)
Okänd
Inlägg: 30172
Blev medlem: 03 mar 2008, 01:30
OS: Ubuntu

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

Inlägg 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?
Användarvisningsbild
Smygis
Inlägg: 849
Blev medlem: 21 jun 2006, 18:41
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Kramfors

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

Inlägg 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.
A Foolish Consistency is the Hobgoblin of Little Minds.Beware: In C++, your friends can see your privates!
Okänd
Inlägg: 30172
Blev medlem: 03 mar 2008, 01:30
OS: Ubuntu

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

Inlägg 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.
Skriv svar

Återgå till "Programmering och webbdesign"