モジュールをインポートしても何も無駄になりません。モジュールは常に完全に(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.argv
2つのことを調べる必要があります。それは、ルックアップするために持っている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)