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
import XX oder from XX import YY ?
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo Tom!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"?
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.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
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
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

-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
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.lunar hat geschrieben:Mmmmh, müsste der from Import nicht ein bisschen schneller sein? Immerhin fällt so doch ein Namespace-Lookup weg, oder?
Ansonsten empfehle ich noch die Wiki-Seite [wiki]Import[/wiki].
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
-
- 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
- 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 
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


-
- 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:
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).
Code: Alles auswählen
import tkMessageBox as tkmb
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo Jens!jens hat geschrieben:Also ich mag from foo import bar eigentlich nicht so sehr, auch wenn es schneller sein soll...
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.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
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.
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.
- birkenfeld
- Python-Forum Veteran
- Beiträge: 1603
- Registriert: Montag 20. März 2006, 15:29
- Wohnort: Die aufstrebende Universitätsstadt bei München
Bei "time.strftime" muss Python 2 Lookups machen: "time" in den Globals, und "strftime" in "time.__dict__".gerold hat geschrieben:Hallo Jens!jens hat geschrieben:Also ich mag from foo import bar eigentlich nicht so sehr, auch wenn es schneller sein soll...
Schneller geschrieben, vielleicht. Aber schneller in der Ausführung? Das wird wohl kaum einen relevanten Unterschied ausmachen.
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.
- 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:
und noch ein paar Sachen so er

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
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.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)
from Imports verwende ich in der Regel nur, wenn ich Klassen importiere:
Code: Alles auswählen
from optparse import OptionParser
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.
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.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Hängt ab, was für Libs man nutzt, in Django sind die bisweilen schon ziemlich verschachtelt: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.
Code: Alles auswählen
from django.newforms.widgets import Textarea, RadioSelect
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice