Я був здивований, що вже не побачив фактичних цифр витрат для повторних перевірок завантаження, опублікованих уже, хоча є багато хороших пояснень, чого очікувати.
Якщо ви імпортуєте вгорі, ви приймаєте навантаження, незважаючи ні на що. Це досить мало, але зазвичай в мілісекундах, а не наносекундах.
Якщо ви імпортуєте в межах функції (функцій), ви приймаєте лише звернення для завантаження тоді, коли і коли вперше буде викликана одна з цих функцій. Як багато хто зазначав, якщо цього зовсім не відбувається, ви економите час завантаження. Але якщо функція (и) додзвонилися багато, ви берете неодноразовий хоча і набагато меншим хітом (для перевірки того, що він вже був завантажений, а не на самому ділі перезавантаження). З іншого боку, як зазначав @aaronasterling, ви також трохи заощадите, тому що імпорт у межах функції дозволяє використовувати трохи швидші локальні пошукові зміни, щоб пізніше визначити ім’я ( http://stackoverflow.com/questions/477096/python- стиль імпорту-кодування / 4789963 # 4789963 ).
Ось результати простого тесту, який імпортує декілька речей з внутрішньої функції. Звіти про час (в Python 2.7.14 на 2.3 GHz 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