J'ai toujours utilisé cette méthode:
from sys import argv
et utiliser argv
avec juste argv . Mais il existe une convention d'utilisation de ceci:
import sys
et en utilisant le argv par sys.argv
La deuxième méthode rend le code auto-documenté et j'y adhère (vraiment) . Mais la raison pour laquelle je préfère la première méthode est sa rapidité, car nous importons uniquement la fonction nécessaire plutôt que le module entier (qui contient davantage de fonctions inutiles que python perdra du temps à les importer). Notez que je n'ai besoin que d'argv et que toutes les autres fonctions de sys sont inutiles pour moi.
Donc mes questions sont. La première méthode rend-elle vraiment le script rapide? Quelle méthode est la plus préférée? Pourquoi?
from … import …
syntaxe en PythonRéponses:
Importer le module ne gaspille rien . le module est toujours entièrement importé (dans le
sys.modules
mappage), que vous utilisiezimport sys
oufrom sys import argv
non.La seule différence entre les deux déclarations concerne le nom lié.
import sys
lie le nomsys
au module (sosys
->sys.modules['sys']
), tandis quefrom sys import argv
lie un nom différentargv
, en pointant directement sur l'attribut contenu à l'intérieur du module (soargv
->sys.modules['sys'].argv
). Le reste dusys
module est toujours là, que vous utilisiez autre chose du module ou non.Il n'y a pas non plus de différence de performance entre les deux approches. Oui,
sys.argv
il faut regarder deux choses; il doit recherchersys
dans votre espace de noms global (trouve le module), puis rechercher l'attributargv
. Et oui, en utilisant,from sys import argv
vous pouvez ignorer la recherche d'attribut, car vous avez déjà une référence directe à cet attribut. Mais l'import
instruction doit encore faire ce travail, elle recherche le même attribut lors de l'importation et vous n'aurez besoin que d'argv
une seule utilisation . Si vous deviez utiliser desargv
milliers de fois dans une boucle, cela pourrait peut-être faire une différence, mais dans ce cas précis, ce n'est vraiment pas le cas.Le choix entre l’un ou l’autre devrait alors reposer sur le style de codage .
Dans un grand module, j'utiliserais certainement
import sys
; la documentation de code est importante, et utilisersys.argv
quelque part dans un module volumineux rend beaucoup plus clair ce que vous faites référence à ce que vousargv
auriez jamais fait.Si le seul endroit que vous utilisez
argv
est dans un'__main__'
bloc pour appeler unemain()
fonction, utilisez-lefrom sys import argv
si vous vous sentez plus heureux:Je l'utilise encore
import sys
moi-même. Toutes choses étant égales par ailleurs (et ce sont exactement les performances et le nombre de caractères utilisés pour l'écrire), c'est plus simple pour moi.Si vous importez autre chose , alors peut-être que la performance entre en jeu. Mais seulement si vous utilisez plusieurs fois un nom spécifique dans un module , par exemple dans une boucle critique. Mais créer un nom local (au sein d'une fonction) sera encore plus rapide:
la source
from...import
vous permet de fairepackage.attribute
plutôt que depackage.subpackage_or_module.attribute
, ce qui peut être utile si vous avez des groupements logiques ou conceptuels dans le paquet, mais que vous voulez rendre les choses un peu plus pratiques pour les utilisateurs de votre paquet. (numpy
fait quelque chose comme ça, je crois.)from django.core.management.base import BaseCommand
sont meilleures, et toute autre chose (en particulierimport django
) conduirait à un code illisible. Donc, même si j'aime cette réponse, je pense qu'il y a des bibliothèques (et en particulier des cadres) dans lesquelles la convention doit violer la simple importation. Comme toujours, utilisez votre jugement pour déterminer ce qui convient le mieux dans une situation donnée. Mais pécher par excès (en d’autres termes, je suis d’accord pour la plupart).import ... as
pour trouver le package à un autre nom:import package.subpackage_or_module as shortname
.from parent import sub
fait, essentiellement, la même chose.Il y a deux raisons pour utiliser
import module
plutôt quefrom module import function
.Le premier est l'espace de noms. L'importation d'une fonction dans l'espace de noms global entraîne des collisions de noms.
Deuxièmement, ce n'est pas pertinent pour les modules standard, mais important pour vos propres modules, en particulier pendant le développement. C'est l'option d'
reload()
un module. Considère ceci:D'autre part
Quant à la vitesse ...
Que vous importiez un module ou importiez une fonction à partir d'un module, Python analysera l'intégralité du module. De toute façon, le module est importé. "Importer une fonction" n'est rien de plus que lier la fonction à un nom. En fait,
import module
c’est moins de travail pour interprète quefrom module import func
.la source
J'utilise
from import
s chaque fois que cela améliore la lisibilité. Par exemple, je préfère (les points-virgules servent uniquement à économiser de l'espace ici):au lieu de:
Ce dernier est plus difficile à lire (et à écrire) pour moi car il contient beaucoup d'informations redondantes. De plus, il est utile de savoir à l'avance quelles parties du module que j'utilise.
Je préfère les jeux réguliers
import
si j'utilise beaucoup de noms abrégés d'un module:Ou si un nom est tellement générique qu'il n'a pas de sens en dehors de son espace de noms:
la source
À mon avis, l'utilisation régulière
import
améliore la lisibilité. Lors de l'examen du code Python, j'aime voir d'où vient la fonction ou la classe donnée, là où elle est utilisée. Cela me évite de faire défiler jusqu'en haut du module pour obtenir cette information.En ce qui concerne les noms de modules longs, j'utilise simplement le
as
mot clé et leur donne des alias courts:Exceptionnellement, j'utilise toujours la
from module import something
notation lorsque je traite avec le__future__
module. Vous ne pouvez tout simplement pas le faire autrement lorsque vous voulez que toutes les chaînes soient unicode par défaut dans Python 2, par exemplela source
Bien
import sys
quefrom sys import agrv
tous les deux importent lesys
module entier , ce dernier utilise la liaison de noms afin que seul leargv
module soit accessible au reste du code.Pour certaines personnes, ce serait le style préféré, car il ne rend accessible que la fonction que vous avez explicitement définie.
Il introduit toutefois des conflits de noms potentiels. Et si vous aviez un autre module nommé
argv
? Notez que vous pouvez également importer explicitement la fonction et renommer avecfrom sys import argv as sys_argv
, une convention qui répond à l'importation explicite et est moins susceptible de provoquer des collisions d'espace de nom.la source
if sys_argv:
meilleur queif sys.argv:
? Je sais ce que la deuxième déclaration signifie, je n'ai aucune idée de ce que la première forme signifie sans revenir en arrière à la bizarre importation.Je me suis récemment posé cette question. J'ai chronométré les différentes méthodes.
bibliothèque de demandes
bibliothèque BeautifulSoup
bibliothèque json
bibliothèque système
Il me semble qu'il y a une légère différence de performance.
la source
import module
avecfrom module import name
correctement, ajouter que la recherche de nom à l'import module
affaire. Par exemple, ajoutez la lignesys.argv
auar
test, etc. Il y aura toujours une différence, car le travail effectué est légèrement différent, car un bytecode différent est généré et des chemins de code différents sont exécutés.import sys
puis utiliser dessys.argv
milliers de fois dans une boucle etfrom sys import argv
ensuite utiliser simplementargv
. Mais tu ne le fais pas. Pour ce que vous faites une fois au niveau global de votre module, vous devez optimiser la lisibilité, et non les différences microscopiques de minutage.Examiner des fragments de code publiés, importer des modules entiers et s'y référer
module.function
est à peu près la norme, du moins pour les modules standard. La seule exception semble êtredatetime
alors vous pouvez dire
datetime.now()
plutôt quedatetime.datetime.now()
.Si vous êtes préoccupé par la performance, vous pouvez toujours dire (par exemple)
et puis faites votre code critique de performance puisque la recherche de module est déjà faite. Cependant, bien que cela fonctionne avec des fonctions / méthodes, la plupart des IDE seront confus et n’afficheront pas (par exemple) de lien source / signature pour la fonction quand elle est assignée à une variable.
la source
Je veux juste ajouter que si vous faites quelque chose comme
(ou toute autre bibliothèque intégrée telle que
sys
ouposix
),sin
sera alors inclus dans la documentation de votre module (c.-à-d. lorsque vous faites>>> help(mymodule)
ou$ pydoc3 mymodule
. Pour éviter cela, importez-le à l'aide de:PS: une bibliothèque intégrée est une bibliothèque compilée à partir de code C et incluse dans Python.
argparse
,os
etio
ne sont pas des packages intégrésla source