Когда выгодно использовать встроенный, одноразовый импорт в Python?
Например:
__import__("x").doSomething()
Выше всегда короче, чем ниже?
import x
x.doSomething()
Или
from x import*
doSomething()
Когда выгодно использовать встроенный, одноразовый импорт в Python?
Например:
__import__("x").doSomething()
Выше всегда короче, чем ниже?
import x
x.doSomething()
Или
from x import*
doSomething()
Ответы:
Это может быть полезно, если вы хотите использовать модуль только один раз в анонимной лямбда-функции, поскольку это позволяет избежать написания отдельного оператора:
lambda x:__import__('SomeModule').foo(x,123)
на один байт короче
from SomeModule import*;f=lambda x:foo(x,123)
Если код является именованной функцией или программой, то __import__вряд ли это поможет, кроме как в самых экстремальных или надуманных обстоятельствах.
importбудет вызван внутри блока с отступом? Возможно нет.
f=потому что анонимные функции разрешены и могут иметь контент вне функции .
При импорте нескольких модулей с достаточно длинными именами может быть полезно назначить __import__функцию более короткой переменной и использовать ее для импорта
Регулярные операторы импорта - 97 байт.
из itertools import * с даты и времени импорта * список печати (перестановки («abc»)) печать datetime.now ()
Назначение __import__на i- 94 байт:
я = __ import__
список печати (i ("itertools"). перестановки ("abc"))
print i ("datetime"). datetime.now ()
__import__("x").doSomething()нужно 15+ х символов для ссылки на модуль с именем длиной х .
import x\nx.doSomething()нужно 9 + 2 * х символов. Эти функции перекрываются при x = 6, поэтому по сравнению с этим лучше использовать любой модуль с более длинным именем __import__, а любой более короткий - выигрывает от обычного импорта:

Однако from x import*\ndoSomething()требуется только 14+ x символов, поэтому по сравнению с обычным импортом это не стоит, если имя модуля не превышает 5 символов:

Все это предполагает, что вы ссылаетесь на функцию / класс / что угодно только один раз. Если вы ссылаетесь на него более одного раза, формулы меняются, и последняя версия может стать победителем. Если вы используете что-то длинное из импортированного модуля несколько раз, побеждает еще одна версия:
from x import y as zдает вам 18+ x + y + z * ( n +1) символов для n случаев использования z , что является большим улучшением, если y велико, потому что z можно сделать 1.
__import__("x").doSomething()на один символ короче from x import*;doSomething(). Может быть, вы считаете новую строку двумя символами? И я помню точку безубыточности, равную 5, падающую между timeи random.
z=__import__("x").y байт короче from x import y as z
from x import*;z=y.
__import__поможет внутри именованной функции, так как он будет внутри отступа блока. Импорт будет стоить дополнительно, поскольку он состоит из двух строк и имеет отступ. (Это предполагает, что импорт не разрешен вне функции.)