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?

questionAnswers(1)

yourAnswerToTheQuestion