Вызов функций внутри функций против возврата, что более эффективно? - PullRequest
0 голосов
/ 12 марта 2020

В следующих 2 случаях, какой из них более эффективен?

Случай 1:

def test(x):
    hello(x)

def hello(y):
    return world(y)

def world(z):
    return z

Случай 2:

def test(x):
    a = hello(x)

def hello(y)
    b = world(y)
    return b

def world(z):
    c = z
    return z

1 Ответ

2 голосов
/ 12 марта 2020

TL; DR: оба одинаково быстры.

Вот время на моей машине с интерпретатором CPython 3.7.6 (на всех oop из 10000000 повторяется 3 раза):

First case: 109 ns
Second case: 111 ns

Разница между ними незначительна. Таким образом, они так же быстры.

Используя PyPy (интерпретатор на основе JIT), JIT-компилятор способен оптимизировать оба случая и удалить все вызовы функций. Благодаря JIT код может быть выполнен с нулевой стоимостью, и время двух случаев, таким образом, абсолютно одинаково.

Если вы используете Cython, могут происходить такие же вещи.

Совет:

Пожалуйста, не изменяйте код Python с помощью микрооптимизации, подобной этой, для повышения производительности. Читаемость имеет приоритет над производительностью в Python. * Если вы действительно заботитесь о производительности такой вещи, пожалуйста, используйте альтернативный интерпретатор, такой как PyPy или Cython, или встроенный компилятор Python JIT (такой как Numba).

...