如何在python中提高迭代性能

问题描述 投票:1回答:2

我对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;

test.js:

let t1 = Date.now()

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

    }
}

let t2 = Date.now()
console.log(t2 - t1)

test.py:

import time

t1 = int(time.time())

L1 = list(range(50000))
L2 = list(range(50000))

for x in L1:
    z = 1
    for y in L2:
        pass

t2 = int(time.time())
print(t2 - t1)

结果:

节点test.js1640(1.6秒)

php test.php27(27秒)

python3 test.py107(107秒)

python performance
2个回答
2
投票

正如@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()

2
投票

Python主要是解释为字节码,而JIT将javascript编译为机器码。作为(非常不可靠)的数量级,Python在微基准测试中的速度要比C / C ++ / Rust慢100倍,而Java和Javascript却慢3倍。实际上,它取决于基准。

如果您以正确的方式使用Python,例如使用numpy而不是遍历每个元素进行矢量数学运算,或者只做一些您大多数时候都在等待网络I / O的事情,就永远不会注意到性能上的很大差异。

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

© www.soinside.com 2019 - 2024. All rights reserved.