Das Importieren des Moduls verschwendet nichts . Das Modul wird immer vollständig importiert (in das sys.modules
Mapping), also ob Sie verwenden import sys
oder from sys import argv
keine Gewinnchancen machen.
Der einzige Unterschied zwischen den beiden Anweisungen besteht darin, welcher Name gebunden ist. import sys
Bindet den Namen sys
an das Modul (so sys
-> sys.modules['sys']
), während from sys import argv
ein anderer Name argv
gebunden wird und direkt auf das im Modul enthaltene Attribut zeigt (so argv
-> sys.modules['sys'].argv
). Der Rest des sys
Moduls ist noch vorhanden, egal ob Sie etwas anderes aus dem Modul verwenden oder nicht.
Es gibt auch keinen Leistungsunterschied zwischen den beiden Ansätzen. Ja, sys.argv
muss zwei Dinge nachschlagen; Es muss sys
in Ihrem globalen Namespace nachschlagen (findet das Modul) und dann das Attribut nachschlagen argv
. Und ja, mit können from sys import argv
Sie die Attributsuche überspringen, da Sie bereits einen direkten Verweis auf das Attribut haben. Die import
Anweisung muss dies jedoch noch tun. Sie sucht beim Importieren nach dem gleichen Attribut und muss nur einmal verwendet argv
werden . Wenn Sie argv
Tausende Male in einer Schleife verwenden müssten, könnte dies möglicherweise einen Unterschied bewirken, in diesem speziellen Fall jedoch nicht.
Die Wahl zwischen dem einen oder anderen sollte stattdessen auf dem Codierungsstil basieren .
In einem großen Modul würde ich sicherlich verwenden import sys
; Die Codedokumentation spielt eine wichtige Rolle, und die Verwendung einer sys.argv
beliebigen Stelle in einem großen Modul macht deutlich, worauf Sie sich beziehen, als dies argv
jemals der Fall gewesen wäre.
Wenn der einzige Ort, den Sie verwenden, argv
in einem '__main__'
Block ist, um eine main()
Funktion aufzurufen , verwenden Sie auf jeden Fall, from sys import argv
wenn Sie sich darüber glücklicher fühlen:
if __name__ == '__main__':
from sys import argv
main(argv)
Ich würde es immer noch selbst benutzen import sys
. Alle Dinge sind gleich (und sie sind genau in Bezug auf die Leistung und die Anzahl der Zeichen, die zum Schreiben verwendet werden), das ist für mich nur ein Augenschmaus.
Wenn Sie etwas ganz anderes importieren , kommt vielleicht die Leistung ins Spiel. Aber nur, wenn Sie einen bestimmten Namen in einem Modul mehrfach verwenden , zum Beispiel in einer kritischen Schleife. Aber dann wird das Erstellen eines lokalen Namens (innerhalb einer Funktion) noch schneller sein:
import somemodule
def somefunction():
localname = somemodule.somefunctionorother
while test:
# huge, critical loop
foo = localname(bar)