Fiquei surpreso ao não ver os números de custo reais das verificações de carga repetidas já publicados, embora haja muitas boas explicações sobre o que esperar.
Se você importa na parte superior, recebe o acerto de carga, não importa o quê. Isso é bem pequeno, mas geralmente em milissegundos, não em nanossegundos.
Se você importar dentro de uma (s) função (s), será possível carregar apenas se e quando uma dessas funções for chamada pela primeira vez. Como muitos salientaram, se isso não acontecer, você economiza o tempo de carregamento. Mas se a função (s) se chamado de um monte, você toma um repetida embora hit muito menor (para verificar que ele tenha sido carregado, não para realmente re-loading). Por outro lado, como @aaronasterling apontou, você também economiza um pouco porque a importação em uma função permite que a função use pesquisas de variáveis locais um pouco mais rápidas para identificar o nome posteriormente ( http://stackoverflow.com/questions/477096/python- estilo de codificação de importação / 4789963 # 4789963 ).
Aqui estão os resultados de um teste simples que importa algumas coisas de dentro de uma função. Os tempos relatados (no Python 2.7.14 em um Intel Core i7 de 2,3 GHz) são mostrados abaixo (a segunda chamada, recebendo mais do que as chamadas posteriores, parece consistente, embora eu não saiba o porquê).
0 foo: 14429.0924 µs
1 foo: 63.8962 µs
2 foo: 10.0136 µs
3 foo: 7.1526 µs
4 foo: 7.8678 µs
0 bar: 9.0599 µs
1 bar: 6.9141 µs
2 bar: 7.1526 µs
3 bar: 7.8678 µs
4 bar: 7.1526 µs
O código:
from __future__ import print_function
from time import time
def foo():
import collections
import re
import string
import math
import subprocess
return
def bar():
import collections
import re
import string
import math
import subprocess
return
t0 = time()
for i in xrange(5):
foo()
t1 = time()
print(" %2d foo: %12.4f \xC2\xB5s" % (i, (t1-t0)*1E6))
t0 = t1
for i in xrange(5):
bar()
t1 = time()
print(" %2d bar: %12.4f \xC2\xB5s" % (i, (t1-t0)*1E6))
t0 = t1