Я был удивлен, не увидев фактических номеров затрат для повторных проверок нагрузки, опубликованных уже, хотя есть много хороших объяснений того, что ожидать.
Если вы импортируете сверху, вы принимаете загрузку, несмотря ни на что. Это довольно мало, но обычно в миллисекундах, а не наносекундах.
Если вы импортируете в функцию (и), вы получите удар только для загрузки, если и когда одна из этих функций вызывается впервые. Как уже отмечали многие, если этого не произойдет, вы сэкономите время загрузки. Но если функция (и) вызывается много раз, вы получаете повторное, хотя и гораздо меньшее попадание (для проверки того, что оно было загружено; не для фактической повторной загрузки). С другой стороны, как отметил @aaronasterling, вы также немного экономите, потому что импорт внутри функции позволяет функции использовать немного более быстрый поиск локальных переменных для идентификации имени позже ( http://stackoverflow.com/questions/477096/python- import-coding-style / 4789963 # 4789963 ).
Вот результаты простого теста, который импортирует несколько вещей из функции. Время, о котором сообщается (в Python 2.7.14 на 2,3-ГГц Intel Core i7), показано ниже (2-ой вызов, принимающий больше, чем более поздние вызовы, кажется последовательным, хотя я не знаю почему).
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
Код:
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