Python与PHP的速度

Cen*_*ion 11 php python

我想解决Project Euler(BTW,问题25)中的问题,我在Python中找到了一个解决方案:

fibonacci = 1
old1 = 0
old2 = 1
limit = 1000

i = 1

while len(str(fibonacci)) < limit:
    fibonacci = old1 + old2
    old1 = old2
    old2 = fibonacci
    i = i + 1

print(i)
Run Code Online (Sandbox Code Playgroud)

计算需要1.5秒.

我在PHP中实现了相同的,这是代码:

$fibonacci = 1;
$old1 = 0;
$old2 = 1;
$limit = 1000;

$i = 1;

while (strlen((string)$fibonacci) < $limit){
    $fibonacci = $old1 + $old2;
    $old1 = $old2;
    $old2 = $fibonacci;
    $i = $i + 1;
}
print($i);
Run Code Online (Sandbox Code Playgroud)

花了30多分钟,还在计算......

我知道Python被认为比PHP更快,但它仍然不应该是那么大的差异.如果有办法,如何改进我的PHP代码以更快地获得结果?

编辑:

我根据下面的评论编辑这篇文章,所以首先我的解决方案不起作用.放一个解决方案可以代替旧的:

while (strlen(number_format($fibonacci, 0, '', '')) < $limit){ ... }
Run Code Online (Sandbox Code Playgroud)

但这又是一个很大的速度问题.

所以最终的解决方案是使用BCMath:

$fibonacci = '1';
$old1 = '0';
$old2 = '1';
$limit = 1000;

$i = 1;

while (strlen($fibonacci) < $limit){

    $fibonacci = bcadd($old1, $old2);
    $old1 = $old2;
    $old2 = $fibonacci;
    $i = $i + 1;
}
echo $fibonacci . "<br />";
print($i);
Run Code Online (Sandbox Code Playgroud)

因此,您可以以与Python中的Python相同的速度获得结果.

JAL*_*JAL 12

当然,PHP正在进入无限循环.如果没有什么不对的话,就没有办法花那么长时间......

我不认为计算这些数字的数字strlen将在PHP中起作用.PHP以科学计数法处理数字,精度低于Python.

echo向PHP 添加了调试语句,为每一步打印出$ fibonacci和$ i.

典型的Python行看起来像

fib is 7540113804746346429
i is 92
Run Code Online (Sandbox Code Playgroud)

在PHP中,那是

fib is 7.54011380475E+18
i is 92
Run Code Online (Sandbox Code Playgroud)

要在PHP中实现这一点,您可能需要使用更高精度的数学库.

查看http://www.php.net/manual/en/book.bc.php - 您可以使用该bcadd函数来完成添加,它将像在Python中一样工作.


Mar*_*ker 6

这不是速度问题,它是终止条件下的逻辑问题.

它可能不会完成.当您将$ fibonacci的当前值转换为while测试中的字符串时,当您将其转换为字符串时,它将转换为科学格式并截断为一组有限的小数位(取决于您的精度设置).该位数将远远小于1000,因此永远不会满足while终止条件.