import XX oder from XX import YY ?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
el3ktro
User
Beiträge: 13
Registriert: Dienstag 15. Mai 2007, 23:38

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
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
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 ;)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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].
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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)
TUFKAB – the user formerly known as blackbird
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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 :(

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

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).
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Selbst wenn es eine unterschied machen würde soviel importiert man ja nicht.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

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.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Nur nochmal um es klar zu stellen... Ich halte die kleinen Performance Unterschiede in dem Zusammenhang auch für irrelevant ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Mephisto
User
Beiträge: 28
Registriert: Mittwoch 17. Januar 2007, 15:52

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
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

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
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
polypus
User
Beiträge: 37
Registriert: Dienstag 27. September 2005, 14:11
Wohnort: Salzburg

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten