Когда выгодно использовать встроенный, одноразовый импорт в 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__
поможет внутри именованной функции, так как он будет внутри отступа блока. Импорт будет стоить дополнительно, поскольку он состоит из двух строк и имеет отступ. (Это предполагает, что импорт не разрешен вне функции.)