Importer le module ne gaspille rien . le module est toujours entièrement importé (dans le sys.modulesmappage), que vous utilisiez import sysou from sys import argvnon.
La seule différence entre les deux déclarations concerne le nom lié. import syslie le nom sysau module (so sys-> sys.modules['sys']), tandis que from sys import argvlie 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 sysmodule 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.argvil faut regarder deux choses; il doit rechercher sysdans votre espace de noms global (trouve le module), puis rechercher l'attribut argv. Et oui, en utilisant, from sys import argvvous pouvez ignorer la recherche d'attribut, car vous avez déjà une référence directe à cet attribut. Mais l' importinstruction 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 argvmilliers 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.argvquelque part dans un module volumineux rend beaucoup plus clair ce que vous faites référence à ce que vous argvauriez jamais fait.
Si le seul endroit que vous utilisez argvest dans un '__main__'bloc pour appeler une main()fonction, utilisez-le from sys import argvsi vous vous sentez plus heureux:
if __name__ == '__main__':
from sys import argv
main(argv)
Je l'utilise encore import sysmoi-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)