Wywołania funkcji Pythona są naprawdę wolne

Ma to na celu przede wszystkim upewnienie się, że moja metodologia jest poprawna, ale moim podstawowym pytaniem było, czy warto sprawdzić poza funkcją, jeśli w ogóle muszę uzyskać dostęp do funkcji. Wiem, wiem, przedwczesna optymalizacja, ale w wielu przypadkach jest to różnica między umieszczeniem instrukcji if wewnątrz wywołania funkcji, aby określić, czy muszę uruchomić resztę kodu, czy umieścić go przed wywołaniem funkcji. Innymi słowy, nie wymaga wysiłku, aby zrobić to w taki czy inny sposób. W tej chwili wszystkie kontrole są pomieszane między sobą i chciałbym, żeby wszystko było ładne i znormalizowane.

Głównym powodem, dla którego zadałem pytanie, było to, że inne odpowiedzi, które widziałem, dotyczyły głównie czasu, ale to dało mi liczby ujemne, więc zmieniłem to na:

import timeit
import cProfile

def aaaa(idd):
    return idd

def main():
    #start = timeit.timeit()
    for i in range(9999999):
        a = 5
    #end = timeit.timeit()
    #print("1", end - start)

def main2():
    #start = timeit.timeit()
    for i in range(9999999):
        aaaa(5)
    #end = timeit.timeit()
    #print("2", end - start)

cProfile.run('main()', sort='cumulative')
cProfile.run('main2()', sort='cumulative')

i dostałem to na wyjście

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.310    0.310 {built-in method exec}
        1    0.000    0.000    0.310    0.310 <string>:1(<module>)
        1    0.310    0.310    0.310    0.310 test.py:7(main)
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    2.044    2.044 {built-in method exec}
        1    0.000    0.000    2.044    2.044 <string>:1(<module>)
        1    1.522    1.522    2.044    2.044 test.py:14(main2)
  9999999    0.521    0.000    0.521    0.000 test.py:4(aaaa)

Dla mnie pokazuje, że nie wywołanie funkcji wynosi 0,31 sekundy, a wywołanie zajmuje 1,52 sekundy, czyli prawie 5 razy wolniej. Ale tak jak powiedziałem, otrzymałem liczby ujemne z timeit, więc chcę się upewnić, że tak naprawdę jestże powolny.

Z tego, co wiem, powód wywołania funkcji jest tak powolny, ponieważ python musi sprawdzać, aby upewnić się, że funkcja nadal istnieje, zanim będzie mogła ją uruchomić lub coś? Czy nie ma sposobu, aby po prostu powiedzieć mu, żeby lubił ... załóżmy, że wszystko nadal tam jest, aby nie musiało wykonywać niepotrzebnej pracy, która (najwyraźniej) spowalnia go 5x?

questionAnswers(1)

yourAnswerToTheQuestion