2017-02-10 12 views
0

Существует алгоритм для простой факторизации в python. Он работает примерно за 10 миллисекунд для большого целого. Я переписал его для php. Также для очень больших целых чисел я использовал bc и gmp функции в php. Результат очень медленный и занимает около 4 секунд для того же входа!PHP vs 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 раз быстрее)

Edit: Вот код питона:

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

Проверить это контрольные показатели https://blog.famzah.net/2016/02/09/cpp-vs-python-vs-perl-vs-php-performance-benchmark-2016/

Вы спрашиваете, почему turttle медленнее, чем лошадь делает ту же схему ,

+0

Спасибо. Но в этой статье утверждается, что 'php7' является самым быстрым. но в моем случае это наоборот. И ваш пример о кадре и обрыве не соответствует действительности, потому что в компьютерной среде алгоритм очень важен. Язык не должен иметь такой большой разницы. Возможно, у меня проблема с производительностью. –

+0

Что относительно скомпилированных языков и интерпретируемых языков? Есть разница. – Wonka