如何提高python中的迭代性能

如何提高python中的迭代性能,python,performance,Python,Performance,我对python引擎在循环迭代中如此低的性能感到好奇。我在nodejs、php和python上测试了相同的算法。下面是代码片段和结果 test.php: <?php $t1 = time(); for($i = 1; $i < 50000; $i++){ $v = 1; for($j = 1; $j < 50000; $j++){ } } $t2 = time(); echo $t2

我对python引擎在循环迭代中如此低的性能感到好奇。我在nodejs、php和python上测试了相同的算法。下面是代码片段和结果

test.php:

<?php
    $t1 = time();

    for($i = 1; $i < 50000; $i++){
        $v = 1;
        for($j = 1; $j < 50000; $j++){

        }
    }

    $t2 = time();

    echo $t2 - $t1;
结果:

node test.js 1640(1.6秒)

php test.php 27(27秒)

python3测试.py 107(107秒)


Python主要是解释字节码,而javascript通过JIT编译成机器码。作为一个(非常不可靠的)数量级,Python在微基准上比C/C++/Rust慢约100倍,而Java和Javascript只慢约3倍。实际上,这取决于基准

如果您以正确的方式使用Python,例如,使用而不是迭代每个元素进行向量计算,或者只是在大部分时间等待网络I/O的地方做一些事情,您将永远不会注意到性能有多大差异


对于代码的关键部分,还可以使用或或C模块来加速数字Python代码。但通常最好使用Python将现有的优化库粘合在一起。

Python主要是解释字节码,而javascript则通过JIT编译成机器码。作为一个(非常不可靠的)数量级,Python在微基准上比C/C++/Rust慢约100倍,而Java和Javascript只慢约3倍。实际上,这取决于基准

如果您以正确的方式使用Python,例如,使用而不是迭代每个元素进行向量计算,或者只是在大部分时间等待网络I/O的地方做一些事情,您将永远不会注意到性能有多大差异


对于代码的关键部分,还可以使用或或C模块来加速数字Python代码。但是通常最好使用Python将现有的优化库粘合在一起。

正如@maxy所回答的,您可以使用numba来加速for循环。以下代码的结果在我的计算机上为0.07

import time
from numba import jit


@jit
def loop_test(num):
    a = 0
    for i in range(num):
        for j in range(num):
            a += 1
    return a


def main():
    t1 = time.time()
    ret = loop_test(50000)
    t2 = time.time()
    print(t2 - t1)


if __name__ == "__main__":
    main()

正如@maxy所回答的,您可以使用numba来加速for循环。以下代码的结果在我的计算机上为0.07

import time
from numba import jit


@jit
def loop_test(num):
    a = 0
    for i in range(num):
        for j in range(num):
            a += 1
    return a


def main():
    t1 = time.time()
    ret = loop_test(50000)
    t2 = time.time()
    print(t2 - t1)


if __name__ == "__main__":
    main()

为什么要将
范围
对象转换为列表?为什么Python版本在内部循环和外部循环中添加了一个赋值,而其他两个得到一个赋值?如果您添加一个C版本,而编译器由于没有效果而删除了整个基准测试部分,这是否意味着节点的性能很差,需要改进?我也经历过这种情况。在python中使用'numpy'模块可以加快迭代速度。在我的机器上,将
范围
对象转换为
列表
的速度大约是原来的两倍!生成器在很大程度上有助于节省内存,但使用它们会带来开销。为什么要将
范围
对象转换为列表?为什么Python版本在内部循环和外部循环中添加了一个赋值,而其他两个得到一个赋值?如果您添加一个C版本,而编译器由于没有效果而删除了整个基准测试部分,这是否意味着节点的性能很差,需要改进?我也经历过这种情况。在python中使用'numpy'模块可以加快迭代速度。在我的机器上,将
范围
对象转换为
列表
的速度大约是原来的两倍!生成器在很大程度上有利于节省内存,但使用它们会带来开销;如果您只是
返回num*num
,它不会更快。(循环可能被优化了。)不错,但要小心数字;如果您只是
返回num*num
,它不会更快。(循环可能被优化了。)
import time
from numba import jit


@jit
def loop_test(num):
    a = 0
    for i in range(num):
        for j in range(num):
            a += 1
    return a


def main():
    t1 = time.time()
    ret = loop_test(50000)
    t2 = time.time()
    print(t2 - t1)


if __name__ == "__main__":
    main()