Golfen mit Python Import

16

Wann ist es sinnvoll, Inline-Importe zum einmaligen Gebrauch in Python zu verwenden?

Beispielsweise:

__import__("x").doSomething()

Ist das Oben immer kürzer als das Unten?

import x
x.doSomething()

Oder

from x import*
doSomething()
Beta-Zerfall
quelle

Antworten:

11

Dies kann nützlich sein, wenn Sie ein Modul nur einmal in einer anonymen Lambda-Funktion verwenden möchten, da Sie so vermeiden können, eine separate Anweisung zu schreiben:

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

ist ein Byte kürzer als

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

Wenn es sich bei dem Code um eine benannte Funktion oder ein benanntes Programm handelt, __import__ist es unwahrscheinlich, dass dies hilfreich ist, es sei denn, es handelt sich um die extremsten oder erfundensten Umstände.

Feersum
quelle
__import__würde innerhalb einer benannten Funktion helfen, da sie sich innerhalb eines eingerückten Blocks befindet. Ein Import würde extra kosten, da er in zwei Zeilen und eingerückt ist. (
Alex A.
@AlexA Ich sehe kein Problem beim Platzieren von Importen außerhalb einer benannten Funktion.
Feersum
Dann würde es jemals eine Zeit geben, in importder innerhalb eines eingerückten Blocks aufgerufen würde? Wahrscheinlich nicht.
Alex A.
Das Platzieren von Importen außerhalb der genannten Funktion funktioniert nicht bei Herausforderungen, bei denen Sie nur eine Funktion schreiben.
Sparr
6
Für das zweite Beispiel ist das nicht erforderlich, f=da anonyme Funktionen zulässig sind und Inhalte außerhalb der Funktion enthalten können .
Donnerstag,
4

Wenn Sie mehrere Module mit ausreichend langen Namen importieren, kann es hilfreich sein, die __import__Funktion einer kürzeren Variablen zuzuweisen und für den Import zu verwenden

Beispiel:

Regelmäßige Importanweisungen - 97 Bytes

aus itertools importieren *
vom datetime-Import *
Liste drucken (Permutationen ("abc"))
print datetime.now ()

Zuweisen __import__zu i- 94 Bytes:

i = __ import__
Liste drucken (i ("itertools"). Permutationen ("abc"))
print i ("datetime"). datetime.now ()
negative sieben
quelle
1

Fast nie.

__import__("x").doSomething()benötigt mehr als 15 x Zeichen, um auf ein Modul mit dem Namen Länge x zu verweisen .

import x\nx.doSomething()benötigt 9 + 2 * x Zeichen. Diese Funktionen überlappen sich bei x = 6, so dass im Vergleich zu dieser Methode jedes Modul mit einem längeren Namen besser verwendet __import__werden kann. Kürzere Funktionen profitieren von normalen Importen:

from x import*\ndoSomething()Benötigt jedoch nur mehr als 14 x Zeichen, so dass es sich im Vergleich zum normalen Import nur lohnt, wenn der Modulname länger als 5 Zeichen ist:

Dies alles setzt voraus, dass Sie sich nur einmal auf eine Funktion / Klasse / was auch immer beziehen. Wenn Sie mehrmals darauf verweisen, ändern sich die Formeln, und die letztere Version wird möglicherweise zum Gewinner. Wenn Sie mehrmals etwas Langes aus einem importierten Modul verwenden, gewinnt eine weitere Version:

from x import y as zSie erhalten 18+ x + y + z * ( n +1) Zeichen für n Verwendungen von z , was eine große Verbesserung darstellt, wenn y groß ist, da z zu 1 gemacht werden kann.

L3viathan
quelle
1
Können Sie Ihre Mathematik überprüfen? Ich finde __import__("x").doSomething()einen Char kürzer als from x import*;doSomething(). Vielleicht zählst du den Zeilenumbruch als zwei Zeichen? Und ich erinnere mich, dass der Break-Even-Punkt 5 ist und zwischen timeund liegt random.
Xnor
@xnor Ich habe keine Zeilenumbrüche zweimal gezählt, aber ich habe übersehen, dass Sie den Punkt in dieser Version nicht benötigen. Gib mir eine Minute, ich werde aktualisieren.
L3viathan
1
z=__import__("x").yist ein Byte kürzer alsfrom x import y as z
negative sieben
1
@negativeseven Shorter: from x import*;z=y.
L3viathan,