Ich habe immer diese Methode verwendet:
from sys import argv
und argv
mit nur argv verwenden . Es gibt jedoch eine Konvention, die dies verwendet:
import sys
und mit dem argv von sys.argv
Die zweite Methode macht den Code selbst dokumentiert und ich halte mich (wirklich) daran. Aber der Grund, warum ich die erste Methode bevorzuge, ist, dass sie schnell ist, weil wir nur die benötigte Funktion importieren, anstatt das gesamte Modul zu importieren (das mehr nutzlose Funktionen enthält, die Python beim Importieren verschwendet). Beachten Sie, dass ich nur argv brauche und alle anderen Funktionen von sys für mich nutzlos sind.
Also meine Fragen sind. Macht die erste Methode das Skript wirklich schnell? Welche Methode wird am meisten bevorzugt? Warum?
from … import …
Syntax in PythonAntworten:
Das Importieren des Moduls verschwendet nichts . Das Modul wird immer vollständig importiert (in das
sys.modules
Mapping), also ob Sie verwendenimport sys
oderfrom sys import argv
keine Gewinnchancen machen.Der einzige Unterschied zwischen den beiden Anweisungen besteht darin, welcher Name gebunden ist.
import sys
Bindet den Namensys
an das Modul (sosys
->sys.modules['sys']
), währendfrom sys import argv
ein anderer Nameargv
gebunden wird und direkt auf das im Modul enthaltene Attribut zeigt (soargv
->sys.modules['sys'].argv
). Der Rest dessys
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 musssys
in Ihrem globalen Namespace nachschlagen (findet das Modul) und dann das Attribut nachschlagenargv
. Und ja, mit könnenfrom sys import argv
Sie die Attributsuche überspringen, da Sie bereits einen direkten Verweis auf das Attribut haben. Dieimport
Anweisung muss dies jedoch noch tun. Sie sucht beim Importieren nach dem gleichen Attribut und muss nur einmal verwendetargv
werden . Wenn Sieargv
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 einersys.argv
beliebigen Stelle in einem großen Modul macht deutlich, worauf Sie sich beziehen, als diesargv
jemals der Fall gewesen wäre.Wenn der einzige Ort, den Sie verwenden,
argv
in einem'__main__'
Block ist, um einemain()
Funktion aufzurufen , verwenden Sie auf jeden Fall,from sys import argv
wenn Sie sich darüber glücklicher fühlen: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:
quelle
from...import
können Sie dies tun,package.attribute
anstatt dies zu tun. Diespackage.subpackage_or_module.attribute
kann hilfreich sein, wenn Sie logische oder konzeptionelle Gruppierungen innerhalb des Pakets haben, die Dinge aber für Benutzer Ihres Pakets ein wenig komfortabler gestalten möchten. (numpy
tut so etwas, glaube ich.)from django.core.management.base import BaseCommand
besser sind, und alles andere (besondersimport django
) würde zu unlesbarem Code führen. Also, während ich diese Antwort mag, denke ich, dass es einige Bibliotheken (und insbesondere einige Frameworks) gibt, in denen die Konvention den bloßen Import verletzen soll. Verwenden Sie wie immer Ihr Urteil darüber, was in einer bestimmten Situation am besten ist. Aber irre auf der Seite des Expliziten (mit anderen Worten, ich stimme größtenteils zu).import ... as
das Paket zu einem anderen Namen zu finden:import package.subpackage_or_module as shortname
.from parent import sub
tut im Wesentlichen das gleiche.Es gibt zwei Gründe für die Verwendung von
import module
anstattfrom module import function
.Erstens ist der Namespace. Das Importieren einer Funktion in den globalen Namespace kann zu Namenskollisionen führen.
Zweitens ist dies nicht relevant für Standardmodule, aber wichtig für Ihre eigenen Module, insbesondere während der Entwicklung. Es ist die Option zu
reload()
einem Modul. Bedenken Sie:Auf der anderen Seite
Was die Geschwindigkeit betrifft ...
Unabhängig davon, ob Sie ein Modul importieren oder eine Funktion aus einem Modul importieren, analysiert Python das gesamte Modul. In beiden Fällen wird das Modul importiert. "Eine Funktion importieren" ist nichts anderes als die Funktion an einen Namen zu binden. In der Tat
import module
ist weniger Arbeit für Dolmetscher alsfrom module import func
.quelle
Ich benutze
from import
s, wenn es die Lesbarkeit verbessert. Zum Beispiel bevorzuge ich (Semikolons sind hier nur platzsparend):Anstatt von:
Letzteres ist für mich schwieriger zu lesen (und zu schreiben), da es so viele redundante Informationen enthält. Außerdem ist es hilfreich, im Voraus zu wissen, welche Teile eines Moduls ich verwende.
Ich bevorzuge reguläre
import
s, wenn ich viele Kurznamen aus einem Modul verwende:Oder wenn ein Name so allgemein ist, dass er außerhalb seines Namensraums keinen Sinn ergibt:
quelle
Meiner Meinung nach
import
verbessert die regelmäßige Verwendung die Lesbarkeit. Wenn ich Python-Code überprüfe, sehe ich gerne, woher die angegebene Funktion oder Klasse kommt und wo sie verwendet wird. Es erspart mir das Scrollen zum oberen Rand des Moduls, um diese Informationen zu erhalten.Für die langen Modulnamen verwende ich einfach das
as
Schlüsselwort und gebe ihnen kurze Aliase:Ausnahmsweise benutze ich immer die
from module import something
Notation, wenn ich mich mit dem__future__
Modul befasse. Sie können es einfach nicht anders machen, wenn Sie möchten, dass alle Zeichenfolgen in Python 2 standardmäßig Unicode sind, zquelle
Obwohl
import sys
undfrom sys import agrv
beide das gesamtesys
Modul importieren , verwendet letzteres die Namensbindung, sodass nur dasargv
Modul für den Rest des Codes zugänglich ist.Für einige Leute wäre dies der bevorzugte Stil, da er nur die von Ihnen ausdrücklich angegebene Funktion zugänglich macht.
Es führt jedoch zu potenziellen Namenskonflikten. Was wäre, wenn Sie ein anderes Modul namens hätten
argv
? Beachten Sie, dass Sie die Funktion auch explizit importieren und umbenennen könnenfrom sys import argv as sys_argv
, eine Konvention, die dem expliziten Import entspricht und die mit geringerer Wahrscheinlichkeit zu Namensraumkollisionen führt.quelle
if sys_argv:
besser alsif sys.argv:
? Ich weiß, was die zweite Aussage bedeutet, ich habe keine Ahnung, was die erste Form bedeutet, ohne zum bizarren Import zurückzukehren.Diese Frage habe ich mir vor kurzem gestellt. Ich habe die verschiedenen Methoden zeitlich festgelegt.
fordert Bibliothek an
schöne Suppenbibliothek
json Bibliothek
Sys-Bibliothek
Es scheint mir, dass es einen kleinen Unterschied in der Leistung gibt.
quelle
import module
mitfrom module import name
korrekt durchzuführen . ZB die Zeile zum Test hinzufügen usw. Es wird immer noch einen Unterschied geben, da die durchgeführte Arbeit leicht unterschiedlich ist, da ein unterschiedlicher Bytecode generiert und unterschiedliche Codepfade ausgeführt werden.import module
sys.argv
ar
import sys
vonsys.argv
Tausenden von Zeit in einer Schleifefrom sys import argv
und der Verwendung von nurargv
. Aber du nicht. Für Dinge, die Sie nur einmal auf globaler Ebene Ihres Moduls tun , sollten Sie wirklich die Lesbarkeit optimieren, nicht mikroskopische Unterschiede in den Timings.Veröffentlichte Codefragmente zu betrachten, ganze Module zu importieren und auf sie zu verweisen,
module.function
ist zumindest für Standardmodule so ziemlich der Standard. Die einzige Ausnahme scheint zu seindatetime
so kann man
datetime.now()
eher sagen alsdatetime.datetime.now()
.Wenn Sie sich Sorgen um die Leistung machen, können Sie immer sagen (zum Beispiel)
Führen Sie dann Ihren leistungskritischen Code aus, da die Modulsuche bereits erfolgt ist. Obwohl dies mit Funktionen / Methoden funktioniert, werden die meisten IDEs verwirrt und zeigen (zum Beispiel) keine Quellverknüpfung / -signatur für die Funktion an, wenn sie einer Variablen zugewiesen wird.
quelle
Ich möchte das nur hinzufügen, wenn Sie so etwas tun
(oder eine andere eingebaute Bibliothek wie
sys
oderposix
),sin
wird dann in die Dokumentation für Ihr Modul aufgenommen (dh wenn Sie dies tun>>> help(mymodule)
oder$ pydoc3 mymodule
. Um dies zu vermeiden, importieren Sie mit:PS: Eine eingebaute Bibliothek ist eine, die aus C-Code kompiliert und in Python enthalten ist.
argparse
,os
Undio
sind nicht eingebaut in Paketenquelle