Python vs PHP速度

2024-05-19 13:25:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从Project Euler中解决一个问题(顺便说一句,问题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)

计算花了1.5秒。在

我在PHP中实现了同样的功能,代码如下:

^{pr2}$

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

我知道Python被认为比PHP快,但它应该没有那么大的区别。如果有办法的话,如何改进我的PHP代码以更快地获得结果?在

编辑:

我根据下面的评论编辑这篇文章,所以首先我的解决方案不起作用。 有一种解决方案可以代替旧方案,而将此方案:

while (strlen(number_format($fibonacci, 0, '', '')) < $limit){ ... }

但同样是一个很大的速度问题。在

所以最后的解决方案是使用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);

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


Tags: 代码project编辑方案解决方案速度fibonacciphp
3条回答

当然,PHP正在进入一个无限循环。如果没有什么不对劲的话,不可能花那么长时间。。。在

我不认为用strlen计算这些数字的位数在PHP中是行不通的。PHP处理的是科学记数法中的数字,精度低于Python。在

我在PHP中添加了调试echo语句,为每个步骤打印出$fibonacci和$I。在

典型的Python行看起来像

fib is 7540113804746346429
i is 92

在PHP中,这是

^{pr2}$

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

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

问题是,你在处理大量的数据。您应该使用BC数学函数(php.net/bc)。所以你的代码可以是:

$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;
}
print($i);

我试过了,大约需要0.095秒

这不是速度问题,而是在while终止条件下的逻辑问题。在

可能不会结束。当您在while测试中将$fibonacci的当前值转换为字符串时,它将转换为科学格式,并在将其转换为string时截断为有限的小数位数集(取决于精度设置)。这个位数将远远小于1000,所以while终止条件永远不会满足。在

相关问题 更多 >