Если есть библиотека, из которой я собираюсь использовать как минимум два метода, есть ли разница в производительности или использовании памяти между следующими?
from X import method1, method2
и
import X
Разница есть, потому что в версии import x
есть два поиска имени: один для имени модуля, а второй для имени функции; с другой стороны, используя from x import y
, у вас есть только один поиск.
Вы можете хорошо это увидеть, используя модуль dis:
import random
def f_1():
random.seed()
dis.dis(f_1)
0 LOAD_GLOBAL 0 (random)
3 LOAD_ATTR 0 (seed)
6 CALL_FUNCTION 0
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
from random import seed
def f_2():
seed()
dis.dis(f_2)
0 LOAD_GLOBAL 0 (seed)
3 CALL_FUNCTION 0
6 POP_TOP
7 LOAD_CONST 0 (None)
10 RETURN_VALUE
Как видите, использование формы from x import y
немного быстрее.
С другой стороны, import x
дешевле, чем from x import y
, потому что поиск по имени меньше; давайте посмотрим на дизассемблированный код:
def f_3():
import random
dis.dis(f_3)
0 LOAD_CONST 1 (-1)
3 LOAD_CONST 0 (None)
6 IMPORT_NAME 0 (random)
9 STORE_FAST 0 (random)
12 LOAD_CONST 0 (None)
15 RETURN_VALUE
def f_4():
from random import seed
dis.dis(f_4)
0 LOAD_CONST 1 (-1)
3 LOAD_CONST 2 (('seed',))
6 IMPORT_NAME 0 (random)
9 IMPORT_FROM 1 (seed)
12 STORE_FAST 0 (seed)
15 POP_TOP
16 LOAD_CONST 0 (None)
19 RETURN_VALUE
не знаю в чем причина, но вроде форма from x import y
выглядит как вызов функции, а потому стоит даже дороже, чем предполагалось; по этой причине, если импортированная функция используется только один раз, это означает, что будет быстрее использовать import x
, а если она используется более одного раза, становится быстрее использовать из х импортировать у
.
Тем не менее, как обычно, я бы посоветовал вам не следовать этим знаниям при принятии решения о том, как импортировать модули и функции, потому что это всего лишь преждевременная оптимизация.
Лично я считаю, что во многих случаях явные пространства имен намного читабельнее, и я бы посоветовал вам сделать то же самое: использовать собственное эстетическое чувство :-)
Нет разницы в памяти или скорости (весь модуль должен быть оценен в любом случае, потому что последняя строка может быть Y = something_else
). В любом случае, если ваш компьютер не из 1980-х годов, это не имеет значения.
Я не верю, что есть какая-то реальная разница, и обычно не стоит беспокоиться об этом небольшом объеме памяти. Если вы собираетесь нажимать на соображения памяти, это, скорее всего, будет в вашем коде.