Importer le module ne gaspille rien . le module est toujours entièrement importé (dans le sys.modules
mappage), que vous utilisiez import sys
ou from sys import argv
non.
La seule différence entre les deux déclarations concerne le nom lié. import sys
lie le nom sys
au module (so sys
-> sys.modules['sys']
), tandis que from sys import argv
lie un nom différent argv
, en pointant directement sur l'attribut contenu à l'intérieur du module (so argv
-> sys.modules['sys'].argv
). Le reste du sys
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 rechercher sys
dans votre espace de noms global (trouve le module), puis rechercher l'attribut argv
. 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 des argv
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 utiliser sys.argv
quelque part dans un module volumineux rend beaucoup plus clair ce que vous faites référence à ce que vous argv
auriez jamais fait.
Si le seul endroit que vous utilisez argv
est dans un '__main__'
bloc pour appeler une main()
fonction, utilisez-le from sys import argv
si vous vous sentez plus heureux:
if __name__ == '__main__':
from sys import argv
main(argv)
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:
import somemodule
def somefunction():
localname = somemodule.somefunctionorother
while test:
# huge, critical loop
foo = localname(bar)