PHP против питона, проблема производительности в переполнении стека

Есть алгоритм для простые множители в python, Это занимает около 10 миллисекунд для большого целого числа. Я переписал это для php, Также для очень больших целых чисел я использовал bc а также gmp функции в php. Результат очень медленно и занимает около 4 секунд для того же ввода!

Вот мой код:

(НОТА: функции в основной функции тестируются отдельно и они очень быстрые)

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 само по себе имеет проблему производительности? Почему питон так быстр? (Примерно в 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

0

Решение

Проверьте этот тест https://blog.famzah.net/2016/02/09/cpp-vs-python-vs-perl-vs-php-performance-benchmark-2016/

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]