2017-02-10 1 views
0

素因数分解のアルゴリズムがpythonにあります。これは、大きな整数に対して約10ミリ秒で実行されます。私はphpのためにそれを書き換えました。また、非常に大きな整数については、私はbcgmp関数をPHPで使用しました。結果は非常に遅いで、同じ入力で約4秒かかります!ここでPHP対Python、PHPでの性能の問題

は私のコードです:

注:主な機能に機能が個別にテストされていると、彼らは非常に高速です)

public function primefactors($n, $sort = false) { 


    $smallprimes = $this->primesbelow(10000); 
    $factors = []; 

    // NOTE: bc or gmp functions is used for big numbers calculations 
    $limit = bcadd(bcsqrt($n) , 1); 
    foreach ($smallprimes as $checker) { 
     if ($checker > $limit) { 
      break; 
     } 
     // while (gmp_mod($n, $checker) == 0) { 
     // while ($n%$checker == 0) { 
     while (bcmod($n, $checker) == 0) { 
      array_push($factors, $checker); 
      // $n = (int)($n/$checker); 
      $n = bcdiv($n, $checker); 
      // $limit = (int)(bcpow($n, 0.5)) + 1; 
      $limit = bcadd(bcsqrt($n) , 1); 
      if ($checker > $limit) { 
       break; 
      } 
     } 
    } 

    if ($n < 2) { 
     return $factors; 
    } 

    while ($n > 1) { 
     if ($this->isprime($n)) { 
      array_push($factors, $n); 
      // var_dump($factors); 
      break; 
     } 
     $factor = $this->pollard_brent($n); 
     $factors = array_merge($factors, $this->primefactors($factor)); 
     $n = (int)($n/$factor); 
    } 
    if ($sort) { 
     sort($factors); 
    } 

    return $factors; 

} 

は私のコード内の任意のパフォーマンスの問題があります?またはphp自体にパフォーマンスの問題がありますか?なぜPythonがとても速いのですか? (約40倍の速さ)

編集:ここでははPythonのコードです:

smallprimes = primesbelow(10000) # might seem low, but 1000*1000 = 1000000, so this will fully factor every composite < 1000000 
def primefactors(n, sort=False): 
    factors = [] 

    limit = int(n ** .5) + 1 
    for checker in smallprimes: 
     if checker > limit: break 
     while n % checker == 0: 
      factors.append(checker) 
      n //= checker 
      limit = int(n ** .5) + 1 
      if checker > limit: break 

    if n < 2: return factors 

    while n > 1: 
     if isprime(n): 
      factors.append(n) 
      break 
     factor = pollard_brent(n) # trial division did not fully factor, switch to pollard-brent 
     factors.extend(primefactors(factor)) # recurse to factor the not necessarily prime factor returned by pollard-brent 
     n //= factor 

    if sort: factors.sort() 

    return factors 
+1

対応するPythonコードなしどのように "翻訳"を比較できますか? –

+0

さて、私はPythonコードを提供しましょう。ありがとう。 –

+0

@ Ev.Kounis編集部分を確認してください。 –

答えて

0

チェックこれはturttleは同じ回路をやって馬よりも低速である理由あなたが求めているhttps://blog.famzah.net/2016/02/09/cpp-vs-python-vs-perl-vs-php-performance-benchmark-2016/

ベンチマーク。

+0

ありがとうございます。しかし、この記事では、「php7」が最も速いと主張しています。私の場合、それは反対です。そして、あなたの例は時間と亀については真実ではありません。なぜなら、コンピュータの中でアルゴリズムは非常に重要であるからです。言語はこれを大きく変えるべきではありません。たぶん私はパフォーマンスが実装された問題があります。 –

+0

コンパイルされた言語と通訳された言語はどうですか?違いがあります。 – Wonka