Me sorprendió no ver los números de costos reales para las verificaciones de carga repetidas publicadas, aunque hay muchas buenas explicaciones de qué esperar.
Si importa en la parte superior, recibe el golpe de carga sin importar qué. Eso es bastante pequeño, pero comúnmente en los milisegundos, no en nanosegundos.
Si importa dentro de una función (s), a continuación, sólo toma el golpe para la carga si y cuando una de esas funciones se llama en primer lugar. Como muchos han señalado, si eso no sucede en absoluto, ahorrará el tiempo de carga. Pero si las funciones se llaman mucho, recibe un golpe repetido aunque mucho más pequeño (para comprobar que se ha cargado; no para volver a cargar realmente). Por otro lado, como señaló @aaronasterling, también ahorras un poco porque importar dentro de una función permite que la función use búsquedas de variables locales ligeramente más rápidas para identificar el nombre más tarde ( http://stackoverflow.com/questions/477096/python- import-coding-style / 4789963 # 4789963 ).
Aquí están los resultados de una prueba simple que importa algunas cosas desde dentro de una función. Los tiempos informados (en Python 2.7.14 en un Intel Core i7 de 2.3 GHz) se muestran a continuación (la segunda llamada que toma más llamadas posteriores parece consistente, aunque no sé por qué).
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
El 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