Seite 1 von 1

import XX oder from XX import YY ?

Verfasst: Dienstag 12. Juni 2007, 21:44
von el3ktro
Hallo,
ich habe mal eine allgemeine Frage zur Import-Anweisung. Was wird denn empfohlen: Sollte ich generell eher z.B. ein "import time" machen oder - wenn ich nur einige wenige Funktionen brauche, z.B. ein "from time import clock, localtime, strftime"? Gibt es da eine Empfehlung? Wie sieht es mit dem Speicherverbrauch aus?

Grüße,
Tom

Re: import XX oder from XX import YY ?

Verfasst: Dienstag 12. Juni 2007, 21:59
von gerold
el3ktro hat geschrieben:Sollte ich generell eher z.B. ein "import time" machen oder - wenn ich nur einige wenige Funktionen brauche, z.B. ein "from time import clock, localtime, strftime"?
Hallo Tom!

Ich glaube, da gibt es keine Empfehlung, sondern nur Vorlieben.

Zum Beispiel importiere ich lieber so: "import time".
Das liegt daran, dass ich eine IDE mit Codevervollständigung benutze. Wenn ich "time." eingegeben habe, dann listet mir WingIDE alle möglichen Objekte auf. So genügt ein "time.str" und schon wird mir "time.strftime" vorgeschlagen.

Wieder Andere arbeiten nicht mit so einer IDE. Für die ist es wahrscheinlich teilweise wieder interessanter, nur die Objekte zu importieren, die sie direkt brauchen.

Finde raus was dir lieber ist. Das kann keiner für dich übernehmen.

Der Speicherverbrauch bleibt gleich. Jedes Modul wird nur einmal importiert. Egal wie oft du dieses Modul im Programm mit "import" importierst. Auch wenn du nur eine Funktion aus dem Modul brauchst, es wird immer das komplette Modul in den Speicher geladen.

mfg
Gerold
:-)

Verfasst: Dienstag 12. Juni 2007, 22:38
von lunar
Mmmmh, müsste der from Import nicht ein bisschen schneller sein? Immerhin fällt so doch ein Namespace-Lookup weg, oder?

Aber selbst wenn dem so ist, dann würde ich trotzdem den normalen Import empfehlen, da dieser insbesondere bei längerem Code die Lesbarkeit erhöht. Man weiß immer, woher ein Name kommt ;)

Verfasst: Mittwoch 13. Juni 2007, 11:09
von Leonidas
lunar hat geschrieben:Mmmmh, müsste der from Import nicht ein bisschen schneller sein? Immerhin fällt so doch ein Namespace-Lookup weg, oder?
Ja, ein Namespace-Lookup fällt weg, aber trotzdem wird im Namespace danach gesucht - macht also keinen großen Unterschied aus - wird wohl schwer messbar sein.

Ansonsten empfehle ich noch die Wiki-Seite [wiki]Import[/wiki].

Verfasst: Mittwoch 13. Juni 2007, 13:22
von mitsuhiko
also ich verwende hauptsächlich from foo import bar. Erstens isses schneller, zweitens kann ich in vim dann ^N machen und drittens bin ich EOL 79 Fan und es macht dann die Zeilen kürzer. Ausnahmen existieren (zb das re Modul, das sys Modul, und so ein paar Freunde)

Verfasst: Mittwoch 13. Juni 2007, 13:48
von jens
Also ich mag from foo import bar eigentlich nicht so sehr, auch wenn es schneller sein soll...
Damit weiß man im Quellentext nicht auf den ersten Blick wo Object XY herkommt. Man muß erst im import Abschnitt nachsehen und suchen...

Bei django wird exzessiv from foo import bar gemacht und ich habs mir mehr oder weniger auch angewöhnt :? Auf der anderen Seite halten die Jungs, anders als ich, nix von EOL 79 :(

Verfasst: Mittwoch 13. Juni 2007, 14:00
von schlangenbeschwörer
Adererseits, bei sehr langen Modulnamen, aus denen man nur ein oder zwei Sachen braucht, kann man es dirent importieren (from foo import bar). Wenn ich sowas hab, kam es auch schon vor, das ich sowas geschrieben hab:

Code: Alles auswählen

import tkMessageBox as tkmb
wobei das noch recht nachvollziebar ist. Wenn man also lange Modulnamen nur selten braucht, kann man doch direkt importieren und bei den "Hauptmodulen" dann import X, oder import X as x, wobei x dann durch die Häufigkeit verständlich bleibt, wenn es nicht eh klar ist (wie zB tk für Tkinter und so).

Verfasst: Mittwoch 13. Juni 2007, 14:01
von gerold
jens hat geschrieben:Also ich mag from foo import bar eigentlich nicht so sehr, auch wenn es schneller sein soll...
Hallo Jens!

Schneller geschrieben, vielleicht. Aber schneller in der Ausführung? Das wird wohl kaum einen relevanten Unterschied ausmachen.

lg
Gerold
:-)

Verfasst: Mittwoch 13. Juni 2007, 14:05
von Sr4l
Selbst wenn es eine unterschied machen würde soviel importiert man ja nicht.

Verfasst: Mittwoch 13. Juni 2007, 14:08
von Y0Gi
Die Ausführungszeit halte ich ebenfalls für irrelevant.

Ein from-Import spart besonders bei einem längeren Namespace und häufiger Verwendung einiges an Code, was natürlich der Übersicht zugute kommt. Dann muss aber auch einigermaßen klar sein, woher der Name im Code dann kommt; bei besonders vielen Imports kann das nämlich schnell undurchsichtig werden.

Ähnliches gilt für die as-Imports. ``import xml.etree.ElementTree as ET`` ist definitiv eine gute Idee und kombiniert sogar schön die Code-Einsparung bei Beibehaltung eines Namespaces. Abgesehen von ``ET`` sind mir allerdings keine gängigen Abkürzungen für bestimmte Module bekannt - und alles unter eigenen Aliasen zu benutzen ist auch keine so gute Idee.

Verfasst: Mittwoch 13. Juni 2007, 14:41
von birkenfeld
gerold hat geschrieben:
jens hat geschrieben:Also ich mag from foo import bar eigentlich nicht so sehr, auch wenn es schneller sein soll...
Hallo Jens!

Schneller geschrieben, vielleicht. Aber schneller in der Ausführung? Das wird wohl kaum einen relevanten Unterschied ausmachen.
Bei "time.strftime" muss Python 2 Lookups machen: "time" in den Globals, und "strftime" in "time.__dict__".

Bei "strftime" nur 1 Lookup.

Relevant ist das kaum, vor allem weil der Globals-Lookup der viel kostspieligere ist. Wenn man wirklich auf solche bisschen Performance angewiesen ist, bindet man "time.strftime" lieber an eine lokale Variable.

Verfasst: Mittwoch 13. Juni 2007, 14:44
von jens
Nur nochmal um es klar zu stellen... Ich halte die kleinen Performance Unterschiede in dem Zusammenhang auch für irrelevant ;)

Verfasst: Mittwoch 13. Juni 2007, 15:08
von Mephisto
Bei pprint und glob z.B. mache ich immer from x import y weil glob.glob oder pprint.pprint einfach doof aussieht :)
Ansonsten benutze ich meistens die "import foo" Variante.

greets meph

Verfasst: Mittwoch 13. Juni 2007, 20:24
von Sr4l
ok also ;-) bei einer Million Mal ist
x = time() 0,3Sekunden schneller als x = time.time()
mit ~1,7 Sekunden gegenüber ~2,0 Sekunden

Was aber nichts daran ändert das ich import meist `import foo` nutze ausnahmen:

Code: Alles auswählen

import Tkinter as tk
from random import randint as rnd
und noch ein paar Sachen so er

Verfasst: Donnerstag 14. Juni 2007, 08:39
von lunar
blackbird hat geschrieben:also ich verwende hauptsächlich from foo import bar. Erstens isses schneller, zweitens kann ich in vim dann ^N machen und drittens bin ich EOL 79 Fan und es macht dann die Zeilen kürzer. Ausnahmen existieren (zb das re Modul, das sys Modul, und so ein paar Freunde)
Also ich komme auch bei EOL 76 mit import foo hin... Die meisten Modulnamen sind ja nicht so lang, dass es da kritisch werden würde.

from Imports verwende ich in der Regel nur, wenn ich Klassen importiere:

Code: Alles auswählen

from optparse import OptionParser

Verfasst: Donnerstag 14. Juni 2007, 08:58
von polypus
Ich muss zugeben, ich verwende beides.

Wenn ich große Module habe, wo ich aber nur eine Funktion/Klasse brauche mach ich from foo import bar.
Ist das Modul klein oder ich brauch das ganze Modul, nehme ich import foo.

Manchmal, vor allem bei Modulen die ich nicht selbst geschrieben habe, hängts vom Namen ab.
Hat das Modul Foo die Funktion write ist Foo.write besser als write allein, finde ich.
Wenn aber der Name der Funktion genug über dieselbe aussagt, ist from Foo import bar genauso praktisch.

Ich jedenfalls mische das je nach Gusto.

Verfasst: Freitag 15. Juni 2007, 17:27
von Leonidas
lunar hat geschrieben:Also ich komme auch bei EOL 76 mit import foo hin... Die meisten Modulnamen sind ja nicht so lang, dass es da kritisch werden würde.
Hängt ab, was für Libs man nutzt, in Django sind die bisweilen schon ziemlich verschachtelt:

Code: Alles auswählen

from django.newforms.widgets import Textarea, RadioSelect