Prodej projektu Duchod.cz - cena 550 tis Kč. Dále MojeFinance.cz, DuchodovaReforma.cz
Zobrazují se odpovědi 1 až 8 z 8

Python vs PHP vs Ruby: Optimalizacia Python skriptu

  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.
    Naposledy upravil node : 01.04.2015 v 09:23

  2. Co se právě děje na Webtrhu?
  3. 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.

  4. Ano na rovnakej masine(Win7 desktop ale), ale je mozne ze na VPSke to bude lepsie optimalizovane a tie vysledky budu ine.

  5. 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.

  6. 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.

  7. 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';

  8. K čemu to je? Ono totiž na základě tohodle nejde tvrdit PHP je rychlejší než Python např. Maximálně lze dojít k poznatku, že funkce foreach v php je rychlejší než funkce for v pythonu. Stejně je tam spoustu ALE.

  9. 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.

Hostujeme u Server powered by TELE3