Jako ja nevim, ale normalni Python je malokdy rychlejsi, nez Java, vetsinou i o rady pomalejsi - https://benchmarksgame.alioth.debian.org/u64q/python.html.
Tohle bych nečekal http://benchmarksgame.alioth.debian.org/u64q/php.html
Njn, když ono je to s těmi testy takové ošidné. Když bych měl parafrázovat: Nevěřím žádnému benchmarku, který jsem si sám nezfalšoval...
Kupříkladu:
C#include <stdio.h>
int main ()
{
long a;
long sum = 0;
for( a = 0; a < 200000000; a++ )
{
sum += a;
}
printf("sum: %ld\n", sum);
return 0;
}
$ gcc -o bench0 bench.c && time ./bench0
sum: 19999999900000000
real 0m0.529s
user 0m0.524s
sys 0m0.000s
Půl sekundy... Hm rychlovka!
Javaclass Bench {
public static void main (String [] args)
{
long i, sum = 0;
for(i=0; i<200000000; i++) {
sum+=i;
}
System.out.println(sum);
}
}
$ javac bench.java && time java Bench
19999999900000000
real 0m0.188s
user 0m0.184s
sys 0m0.016s
Tý jo! Java skoro 3x rychlejší než C?! (viz. dále)
PHP<?php
$sum = 0;
for($i=0; $i<200000000; $i++) {
$sum += $i;
}
echo($sum."\n");
?>
$ time php -f bench.php
19999999900000000
real 0m8.860s
user 0m8.836s
sys 0m0.012s
No to se dalo čekat.
Pythonsum = 0
for i in range(200000000):
sum+=i
print(sum)
$ time python bench3.py
19999999900000000
real 0m25.327s
user 0m21.612s
sys 0m3.616s
No to teda vypadá vážně blbě!
Python 3$ time python3 bench3.py
19999999900000000
real 0m21.746s
user 0m21.676s
sys 0m0.012s
Taky propadak! ...
No jo, jenže...
Python 2sum = 0
for i in xrange(200000000):
sum+=i
print(sum)
(range vs xrange)
$ time python bench.py
19999999900000000
real 0m15.998s
user 0m15.972s
sys 0m0.000s
No vida, jedno písmenko a co to udělá, že? ;-)
A co na to JIT, když Java má, chci ho taky!
PyPy$ time pypy bench3.py
19999999900000000
real 0m1.175s
user 0m1.152s
sys 0m0.016s
To je už hodně zajímavé, jen dvojnásobek času, který na to potřebuje C.
$ time pypy bench.py
19999999900000000
real 0m1.165s
user 0m1.156s
sys 0m0.004s
A tady jakbysmet.
Ale ruku na srdce, ono v Pythonu se to stejně má dělat jinak, že...
Python 3print(sum(range(200000000)))
$ time python3 bench-sum-range.py
19999999900000000
real 0m3.209s
user 0m3.200s
sys 0m0.000s
To už je 7x rychlejší než původní kód...
Python 2$ cat bench-sum-xrange.py
print sum(xrange(200000000))
$ time python bench-sum-xrange.py
19999999900000000
real 0m1.335s
user 0m1.324s
sys 0m0.000s
Tohle je dokonce 19x rychlejší než původní kód a zase se přibližujeme rychlosti Céčka.
A Python má vlastně hromady specializovaných knihoven, že...
Python 3import numpy
print numpy.sum(numpy.arange(200000000))
$ time python3 bench-numpy.py
19999999900000000
real 0m1.745s
user 0m0.792s
sys 0m0.876s
Hm, 2x rychlejší než kód bez specializované knihovny.
Python 2$ time python bench-numpy.py
19999999900000000
real 0m1.599s
user 0m0.684s
sys 0m0.900s
Mno a tady jsme si kupodivu nepomohli.
A pro pořádek, v Céčku bychom to asi těžko kompilovali s -O0, že?
C$ gcc -O1 -o bench1 bench.c && time ./bench1
sum: 19999999900000000
real 0m0.085s
user 0m0.080s
sys 0m0.000s
Kde jsi Javo?
$ gcc -O2 -o bench2 bench.c && time ./bench2
sum: 19999999900000000
real 0m0.003s
user 0m0.000s
sys 0m0.000s
Java? Cože? Kde?
Pointa je myslím jasná...
- když budu chtít, může Java vypadat lepší než C a PHP bude vypadat velmi zajímavě
- když budu patlal, tak v Pythonu budu daleko za všemi ostatními.
- ale pak si pustíme desktopový program v Javě a budeme se divit, co se stalo s tou pověstnou o řády rychlejší Javou
- když budu chtít, bude se Python blížit Céčku
- když použiji možnosti konkrétní implementace daného jazyka (specializované knihovny, JIT ap.), bude to vypadat zase úplně jinak
- s Céčkem stejně všem nakopu zadnice, protože takhle úloha se s optimalizacemi přeloží na pár strojových instrukcí a pak je spouštění takového programu dražší než vlastní běh, ale dělat v tom backend pro webové appky bych fakt nechtěl (naposled si vzpomínám hromadu let zpátky nějaké CGI "skripy", ale to byla úplně jiná doba).
Mimochodem zkuste si ten rozsah pro jednotlivé testy zvětšit desetinásobně. Příklady s range v Python 2 vám na paměť utlučou stroj s 16 GiB RAM (protože to vytváří list o daném počtu položek), kdežto xrange či Python 3 spotřebu paměti elegatně řeší, protože to hodnoty pro výpočet generuje až když jsou třeba.
Osobně si myslím, že tvrzení, že Python je pomalý není moc moudré. Když se budeme bavit o konkrétní implementaci jazyka, to už pravda být může (CPython pro konkrétní zpatlaný algoritmus), ale nemusí (PyPy) či vhodně zvolený algoritmus a možnosti dané implementace (xrange, numpy, sum+xrange).
Docela by mohlo být zajímavé, jak by se to měnilo s výpočty ve floating point (a tady by si obdobné zadání ve FP říkalo o prohnání např. přes OpenCL ap. a pak už je jazyk irelevantní, vše to bude jen lepidlo pro HW akcelerovaný běh).