我一直听说Python比PHP更快,特别是对于数学运算,所以我对这段Python代码的性能感到非常惊讶。是什么给了什么?
的Python:
iterations = 1000000
x = [i for i in range(iterations)]
y = [i*i for i in range(iterations)]
def integrate(x, y):
total = 0
size = len(x)
for i in range(1, size):
total += (x[i] - x[i-1]) * .5*(y[i] + y[i-1])
return total
for i in range(100):
integrate(x, y)
PHP:
<?php
$x = [];
$y = [];
$iterations = 1000000;
for($i = 0; $i < $iterations; $i++)
{
$x[] = $i;
$y[] = $i * $i;
}
function integrate(array $x, array $y)
{
$sum = 0;
$size = count($x);
for($i = 1; $i < $size; $i++)
{
$sum += ($x[$i] - $x[$i-1]) * ($y[$i] + $y[$i-1])/2;
}
return $sum;
}
for($i = 0; $i < 100; $i++)
{
integrate($x, $y);
}
答案 0 :(得分:0)
首先,在Python中,一切都是对象。 for i in range(1, size)
为每个测试创建了一百万个对象,如果你使用的是Python 2,它在开始处理之前就会这样做,同时也会破坏你的缓存。我不做PHP而且不知道你看到了什么样的速度,但这个版本的集成比使用Python 2.7的我的机器上的Python版本快25%:
def integrate(x, y):
total = 0
x, y = iter(x), iter(y)
x0 = next(x)
y0 = next(y)
for x1, y1 in itertools.izip(x, y):
total += (x1 - x0) * (y1 + y0) * 0.5
x0 = x1
y0 = y1
return total
当然,Python被认为更快的主要原因之一就是所有可以轻松下载的库。对于这项任务,你几乎肯定会使用numpy而不是直接的Python。
因为,Python中的所有都是一个对象,而整数是不可变对象。甚至行total += (x1 - x0) * (y1 + y0) * 0.5
每次执行时都会创建并销毁5个对象:创建x1 - x0,创建y1 + y0,创建产品,销毁前两个对象,创建除以两个对象,销毁产品,创建新的总数,销毁旧的总数和除以两个对象。
我不相信PHP解释器正在做的很多工作,所以这正是那种使PHP相对于Python看起来很好的基准。