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?