logo
01.04.2015 09:18
1
Ahojte.
Robil som si jednoduchy PHP skript ktory bezal 11 sekund a tak ma napadlo porovnat rychlost s Pythonom a Ruby, s ktorymi vobec nerobim.

Tak som si dal nieco dokopy a vyslo mi Python 6 sekund a Ruby 11 sekund.
Kamarat mi potom prepisal Ruby skript ktory sa tym dostal na 1.5 sekundy.

Pocul som ze v poslednom Ruby dost zapracovali na rychlosti ale oproti Pythonu mi to pride az prirychle, tak by ma zaujimalo ci sa da optimalizovat aj ten Python skript aby zbehol rychlejsie, nakolko podla vsetkeho co som nasiel ma byt Python rychlejsi nez Ruby tak si to chcem overit v praxi.

Tu su kody a konkretne mi ide teda o ten Python(ak to ide optimalizovat este nejako vobec):

PHP
Kód:
<?php
$start = (float) microtime(1);
$results = (int) 0;
$rng = range(9999, 1000000);
foreach($rng AS $i) {
  $args = str_split($i);
  $sum = (int) 0;
  foreach ($args AS $num) {
    $sum += (int) $num;
  }
  if ($sum === 48) {
  	$results++;
    //print $i . PHP_EOL;
  }
}
print $results . ' results in ' . ((float) microtime(1) - $start) . ' seconds';
Ruby
Kód:
start = Time.now.to_f

results = 0

(9999..1000000).each do |x|
  res = 0
  y = x.to_s.each_char { |n| res = res + n.to_i }

  if res == 48
    results = results + 1
  end
end

print(results , " results in " , (Time.now.to_f - start) , " seconds")
Python
Kód:
import datetime
start = datetime.datetime.now()
results = 0
for x in range(9999, 1000000):
    y = str(x)
    res = 0
    for digit in y:
        res += int(digit)
    if res is 48:
        results += 1
        #print(x)

print(results, " results in ", (datetime.datetime.now() - start), " seconds")
V principe ide o to najst vsetky cisla v rozmedzi 9999 az 1000000 ktore ked sa spocitaju ich jendotlive cislice daju dokopy 48.

Edit:
tak PHP teraz zbehne za 6.5s a Python za 3.25s.

Co se právě děje na Webtrhu?

01.04.2015 10:09
2
Spouštíš to doufám na stejném serveru, aby byly výsledky porovnatelné? Jinak jen pro zajímavost jsem si zkusil u sebe pustit PHP verzi a já to měl za 1,7 s.
01.04.2015 10:27
3
Ano na rovnakej masine(Win7 desktop ale), ale je mozne ze na VPSke to bude lepsie optimalizovane a tie vysledky budu ine.
01.04.2015 11:09
4
Zalezi taky na jake verzi PHP to testujes, zkusil jsem napr. rozdil php 5.3, php 5.6 na stejnem stroji a tam je rozdil 20%. Kdyz pouzijes misto vnoreneho foreachu primo funkci $sum = array_sum(str_split($i)); tak se dostanes jeste na lepsi cas.
01.04.2015 11:34
5
Malou odchylku muze davat taky build; tezko rici, s jakymi flagy byla provedena kompilace, ale v optimalizaci muze byt velky skok. Idealne to poustet v clean unix prostredi pod vlastnim buildem. Ruby ani python neznam, ale z jednoho testu na 1 stroji bych nebral jako nejaky bench; hodne faktoru muze mit vlit a jeste pod windowsem. Obecne python by mel byt nejrychlejsi.
01.04.2015 13:06
6
No myslím že hlavní problém rozdílu času toho skriptu v PHP je, že tam máš na začátku vytvoření toho pole pomocí range, které ti vytvoří pole těchto hodnot, které potom teprve procházíš a v jiných jazycích to procházíš pouze pomocí FOR vyzkoušej si spustit tento skript jak dlouho bude trvat ;)
Kód:
$start = (float) microtime(1);
$results = (int) 0;
for($i = 9999; $i <= 1000000; $i++) {
  $args = str_split($i);
  $sum = (int) 0;
  foreach ($args AS $num) {
    $sum += (int) $num;
  }
  if ($sum === 48) {
        $results++;
    //print $i . PHP_EOL;
  }
}
print $results . ' results in ' . ((float) microtime(1) - $start) . ' seconds';
nebo i případně pomocí toho array_sum
Kód:
$start = (float) microtime(1);
$results = (int) 0;
for($i = 9999; $i <= 1000000; $i++) {
  $args = str_split($i);
  $sum = array_sum($args);
  if ($sum === 48) {
        $results++;
    //print $i . PHP_EOL;
  }
}
print $results . ' results in ' . ((float) microtime(1) - $start) . ' seconds';
01.04.2015 13:18
7
...
01.04.2015 13:33
8
Mates: range je pouzity v kazdej variante tak preto. foreach je v php omnoho rychlejsie ako for, preto foreach.
kenod: array_sum vyskusam.
Kamos zbehol ten php skript na VPSke za 1.5 sekundy :D a Python(2.7) za 4.7s. Mozno Python 3.2 bude rychlejsi(zistim).
Je mozne ze Python je pre Win nejako nestastne skompilovany a preto je momentalne najpomalsi(PHP aj Ruby 1.5s, Python 6.5s), na tej VPSke s Linuxom/BSD by to asi slapalo inak.