Как улучшить производительность итерации в python - PullRequest
1 голос
/ 11 января 2020

Мне любопытно, что такая низкая производительность двигателя python в итерации oop. Я проверил тот же алгоритм на 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)

результаты:

проверка узла. js 1640 (1,6 секунды)

php проверка. php 27 (27 секунд)

python3 test.py 107 (107 секунд)

Ответы [ 2 ]

2 голосов
/ 11 января 2020

Как ответил @maxy, вы можете использовать numba для ускорения для l oop. Результат следующего кода 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 голосов
/ 11 января 2020

Python в основном интерпретируется байт-кодом, тогда как javascript компилируется в машинный код с помощью JIT. Как (очень ненадежный) порядок величины, Python в микробенчмарках на ~ 100 раз медленнее, чем C / C ++ / Rust, в то время как Java и Javascript медленнее всего в ~ 3 раза. В действительности это зависит от эталона.

Если вы используете Python правильный путь, например, используйте numpy вместо того, чтобы перебирать каждый элемент для векторной математики, или просто делать вещи где большую часть времени вы будете ожидать сетевой ввод-вывод, вы никогда не заметите большой разницы в производительности.

Также возможно ускорение нумерации c Python кода с помощью numba или cython или C модуль только для критической части вашего кода. Но обычно лучше использовать Python для склеивания существующих оптимизированных библиотек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...