Python импорт X или из X импорт Y? (производительность)

Если есть библиотека, из которой я собираюсь использовать как минимум два метода, есть ли разница в производительности или использовании памяти между следующими?

from X import method1, method2

и

import X
28
задан JohnE 21 July 2018 в 07:55
поделиться

3 ответа

Разница есть, потому что в версии 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, а если она используется более одного раза, становится быстрее использовать из х импортировать у.

Тем не менее, как обычно, я бы посоветовал вам не следовать этим знаниям при принятии решения о том, как импортировать модули и функции, потому что это всего лишь преждевременная оптимизация.
Лично я считаю, что во многих случаях явные пространства имен намного читабельнее, и я бы посоветовал вам сделать то же самое: использовать собственное эстетическое чувство :-)

37
ответ дан 28 November 2019 в 03:06
поделиться

Нет разницы в памяти или скорости (весь модуль должен быть оценен в любом случае, потому что последняя строка может быть Y = something_else). В любом случае, если ваш компьютер не из 1980-х годов, это не имеет значения.

9
ответ дан 28 November 2019 в 03:06
поделиться

Я не верю, что есть какая-то реальная разница, и обычно не стоит беспокоиться об этом небольшом объеме памяти. Если вы собираетесь нажимать на соображения памяти, это, скорее всего, будет в вашем коде.

5
ответ дан 28 November 2019 в 03:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: