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.
el3ktro
User
Beiträge: 13
Registriert: Dienstag 15. Mai 2007, 23:38

Dienstag 12. Juni 2007, 21:44

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Dienstag 12. Juni 2007, 21:59

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
:-)
[url]http://halvar.at[/url] | [url=http://halvar.at/elektronik/kleiner_bascom_avr_kurs/]Kleiner Bascom AVR Kurs[/url]
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
lunar

Dienstag 12. Juni 2007, 22:38

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 13. Juni 2007, 11:09

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 Modvoice
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Mittwoch 13. Juni 2007, 13:22

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
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 13. Juni 2007, 13:48

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

CMS in Python: http://www.pylucid.org
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:

Mittwoch 13. Juni 2007, 14:00

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Mittwoch 13. Juni 2007, 14:01

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
:-)
[url]http://halvar.at[/url] | [url=http://halvar.at/elektronik/kleiner_bascom_avr_kurs/]Kleiner Bascom AVR Kurs[/url]
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:

Mittwoch 13. Juni 2007, 14:05

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

Mittwoch 13. Juni 2007, 14:08

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

Mittwoch 13. Juni 2007, 14:41

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
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 13. Juni 2007, 14:44

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Mephisto
User
Beiträge: 28
Registriert: Mittwoch 17. Januar 2007, 15:52

Mittwoch 13. Juni 2007, 15:08

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:

Mittwoch 13. Juni 2007, 20:24

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

Donnerstag 14. Juni 2007, 08:39

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
Antworten