Гольф с Python Import


16

Когда выгодно использовать встроенный, одноразовый импорт в Python?

Например:

__import__("x").doSomething()

Выше всегда короче, чем ниже?

import x
x.doSomething()

Или

from x import*
doSomething()

Ответы:


11

Это может быть полезно, если вы хотите использовать модуль только один раз в анонимной лямбда-функции, поскольку это позволяет избежать написания отдельного оператора:

lambda x:__import__('SomeModule').foo(x,123)

на один байт короче

from SomeModule import*;f=lambda x:foo(x,123)

Если код является именованной функцией или программой, то __import__вряд ли это поможет, кроме как в самых экстремальных или надуманных обстоятельствах.


__import__поможет внутри именованной функции, так как он будет внутри отступа блока. Импорт будет стоить дополнительно, поскольку он состоит из двух строк и имеет отступ. (Это предполагает, что импорт не разрешен вне функции.)
Алекс А.

@AlexA Я не вижу проблем с размещением импорта вне именованной функции.
feersum

Тогда когда-нибудь будет время, когда importбудет вызван внутри блока с отступом? Возможно нет.
Алекс А.

размещение импорта вне указанной функции не будет работать для задач, когда вы пишете только одну функцию.
Спарр

6
Во втором примере не требуется, f=потому что анонимные функции разрешены и могут иметь контент вне функции .
xnor

4

При импорте нескольких модулей с достаточно длинными именами может быть полезно назначить __import__функцию более короткой переменной и использовать ее для импорта

Пример:

Регулярные операторы импорта - 97 байт.

из itertools import *
с даты и времени импорта *
список печати (перестановки («abc»))
печать datetime.now ()

Назначение __import__на i- 94 байт:

я = __ import__
список печати (i ("itertools"). перестановки ("abc"))
print i ("datetime"). datetime.now ()

1

Почти никогда.

__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.


1
Вы можете проверить свою математику? Я считаю, что __import__("x").doSomething()на один символ короче from x import*;doSomething(). Может быть, вы считаете новую строку двумя символами? И я помню точку безубыточности, равную 5, падающую между timeи random.
xnor

@xnor Я не считал переводы строки дважды, но я упустил, что вам не нужна точка в этой версии. Дайте мне минуту, я обновлю.
L3viathan

1
z=__import__("x").y байт короче from x import y as z
отрицательное семь

1
@negativeseven Короче: from x import*;z=y.
L3viathan
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.