Chamadas da função Python são muito lentas
Isso é principalmente para garantir que minha metodologia esteja correta, mas a minha pergunta básica foi se vale a pena verificar fora de uma função se eu precisar acessar a função. Eu sei, eu sei, otimização prematura, mas em muitos casos, é a diferença entre colocar uma instrução if dentro da chamada de função para determinar se eu preciso executar o resto do código ou colocá-lo antes da chamada de função. Em outras palavras, não é necessário fazer isso de uma forma ou de outra. Agora, todas as verificações são misturadas entre ambos, e eu gostaria que tudo fosse bom e padronizado.
A principal razão que eu perguntei é porque as outras respostas que eu vi na maior parte referiram timeit, mas isso me deu números negativos, então eu mudei para isto:
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')
e tenho isso para saída
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)
Para mim, isso mostra que não chamar a função é 0,3 segundos, e chamar leva 1,52 segundos, o que é quase 5 vezes mais lento. Mas como eu disse, eu tenho números negativos com timeit, então eu quero ter certezanaquela lento.
Além disso, pelo que eu entendo, a razão pela qual as chamadas de função são tão lentas é porque o Python precisa procurar para ter certeza de que a função ainda existe antes de executá-la ou algo assim? Não há como dizer que gosta ... presumir que tudo ainda está lá, para que não tenha que fazer um trabalho desnecessário que (aparentemente) reduz a velocidade de 5x?