PHP vs python,php 中的性能问题



python中有一种素数分解算法。对于一个大整数,它在大约 10 毫秒内运行。我为php重写了它.另外,对于非常大的整数,我在php中使用了bcgmp函数。结果非常慢,相同的输入大约需要 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本身存在性能问题?为什么 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

检查此基准测试 https://blog.famzah.net/2016/02/09/cpp-vs-python-vs-perl-vs-php-performance-benchmark-2016/

你在问为什么比做同样赛道的马慢。

最新更新