Das Importieren des Moduls verschwendet nichts . Das Modul wird immer vollständig importiert (in das sys.modulesMapping), also ob Sie verwenden import sysoder from sys import argvkeine Gewinnchancen machen.
Der einzige Unterschied zwischen den beiden Anweisungen besteht darin, welcher Name gebunden ist. import sysBindet den Namen sysan das Modul (so sys-> sys.modules['sys']), während from sys import argvein anderer Name argvgebunden wird und direkt auf das im Modul enthaltene Attribut zeigt (so argv-> sys.modules['sys'].argv). Der Rest des sysModuls 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.argvmuss zwei Dinge nachschlagen; Es muss sysin Ihrem globalen Namespace nachschlagen (findet das Modul) und dann das Attribut nachschlagen argv. Und ja, mit können from sys import argvSie die Attributsuche überspringen, da Sie bereits einen direkten Verweis auf das Attribut haben. Die importAnweisung muss dies jedoch noch tun. Sie sucht beim Importieren nach dem gleichen Attribut und muss nur einmal verwendet argv werden . Wenn Sie argvTausende 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.argvbeliebigen Stelle in einem großen Modul macht deutlich, worauf Sie sich beziehen, als dies argvjemals der Fall gewesen wäre.
Wenn der einzige Ort, den Sie verwenden, argvin einem '__main__'Block ist, um eine main()Funktion aufzurufen , verwenden Sie auf jeden Fall, from sys import argvwenn 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)