为什么这个python代码比php版本慢?

时间:2015-07-26 18:18:33

标签: php python

我一直听说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);  
}

1 个答案:

答案 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看起来很好的基准。