Comparação: declaração de importação vs função __import__
Como acompanhamento da perguntaUsando builtin__import__()
em casos normais, Conduzi alguns testes e me deparei com resultados surpreendentes.
Estou aqui comparando o tempo de execução de um clássicoimport
e uma chamada para o__import__
função embutida. Para esse fim, eu uso o seguinte script no modo interativo:
import timeit
def test(module):
t1 = timeit.timeit("import {}".format(module))
t2 = timeit.timeit("{0} = __import__('{0}')".format(module))
print("import statement: ", t1)
print("__import__ function:", t2)
print("t(statement) {} t(function)".format("<" if t1 < t2 else ">"))
Como na pergunta vinculada, aqui está a comparação ao importarsys
, junto com alguns outros módulos padrão:
>>> test('sys')
import statement: 0.319865173171288
__import__ function: 0.38428380458522987
t(statement) < t(function)
>>> test('math')
import statement: 0.10262547545597034
__import__ function: 0.16307580163101054
t(statement) < t(function)
>>> test('os')
import statement: 0.10251490255312312
__import__ function: 0.16240755669640627
t(statement) < t(function)
>>> test('threading')
import statement: 0.11349136644972191
__import__ function: 0.1673617034957573
t(statement) < t(function)
Por enquanto, tudo bem,import
é mais rápido que__import__()
. Isso faz sentido para mim, porque, como escrevi no post vinculado, acho lógico que oIMPORT_NAME
instrução é otimizada em comparação comCALL_FUNCTION
, quando o último resultar em uma chamada para__import__
.
Mas quando se trata de módulos menos padrão, os resultados são inversos:
>>> test('numpy')
import statement: 0.18907936340054476
__import__ function: 0.15840019037769792
t(statement) > t(function)
>>> test('tkinter')
import statement: 0.3798560809537861
__import__ function: 0.15899962771786136
t(statement) > t(function)
>>> test("pygame")
import statement: 0.6624641952621317
__import__ function: 0.16268579177259568
t(statement) > t(function)
Qual é a razão por trás dessa diferença nos tempos de execução? Qual é a verdadeira razão pela qual oimport
declaração é mais rápida em módulos padrão? Por outro lado, por que o__import__
funcionar mais rápido com outros módulos?
Teste leva com Python 3.6