モジュールをインポートしても何も無駄になりません。モジュールは常に完全に(sys.modulesマッピングに)インポートされるため、使用するimport sysかどうかfrom sys import argvは関係ありません。
2つのステートメントの唯一の違いは、バインドされる名前です。モジュールにimport sys名前sysをバインドし(so- sys> sys.modules['sys'])、from sys import argv別の名前をバインドargvします。モジュール内に含まれる属性を直接指します(so- argv> sys.modules['sys'].argv)。sysモジュールの他のものを使用するかどうかに関係なく、モジュールの残りの部分はまだそこにあります。
また、2つのアプローチの間にパフォーマンスの違いはありません。はい、sys.argv2つのことを調べる必要があります。それは、ルックアップするために持っているsysあなたのグローバル名前空間に(モジュールを見つけた)、その後、属性を調べますargv。そして、はい、from sys import argvすでに属性への直接参照を持っているので、使用することで属性検索をスキップできます。しかし、importステートメントはまだその作業を行う必要があり、インポート時に同じ属性を検索し、argv 一度だけ使用する必要があります。argvループで何千回も使用する必要がある場合、おそらく違いが生じる可能性がありますが、この特定のケースでは実際には違いはありません。
その場合、どちらか一方の選択は、代わりにコーディングスタイルに基づいている必要があります。
で大規模なモジュール、私は確かに使うだろうimport sys。コードのドキュメントが重要でありsys.argv、大きなモジュールのどこかを使用すると、参照しているものがargv今までよりもずっと明確になります。
使用する唯一の場所が関数を呼び出すブロックargv内にある場合、それについて満足している場合は必ず使用してください:'__main__'main()from sys import argv
if __name__ == '__main__':
    from sys import argv
    main(argv)
私はまだimport sys自分でそこを使用します。すべてのものが等しい(正確には、パフォーマンスと書き込みに使用される文字数の点で)ので、それは私にとっては簡単です。
他のものをすべてインポートする場合、おそらくパフォーマンスが影響します。ただし、たとえば重要なループなどで、モジュール内で特定の名前を何度も使用する場合のみです。ただし、(関数内での)ローカル名の作成はさらに高速になります。
 import somemodule
 def somefunction():
      localname = somemodule.somefunctionorother
      while test:
          # huge, critical loop
          foo = localname(bar)