2017-05-05 11 views
3

は、それが実際だけでなくfunctionのメモリに全体moduleを輸入しない、私はインポートモジュール(またはパッケージ).functionは実際にモジュール/パッケージ全体をインポートしますか?

import module.function 

したいと?

私はモジュールから必要な機能をインポートするだけでメモリ消費量が少なくなると思っていたので、この質問をします。

編集
私の質問を明確にし、次の二つのコンテキストでそれを頼む:
modulefunction1およびその他の機能の定義とクラス定義を含む単一module.pyファイルですは、ロードされた全体moduleですメモリに格納するか、または定義部分のfunction1だけを使用しますか?
ここで、packagenumpyのようなパッケージであり、ここにはファイル階層が含まれています(Mike Tungなど)。パッケージ全体がメモリにロードされているか、function1定義を含むモジュールファイルか、またはそのモジュールファイルの一部だけがfunction1と定義されていますか?

答えて

2

のはあなたがapp.py

で使用するためにfooの下にあるすべてのPYファイルをインポートすると言っているapp.py

import foo 

に言うとき、あなたは、次のような構造

app/ 
├── foo/ 
│ ├── __init__.py 
│ ├── foo1.py 
│ └── foo2.py 
├── bar/ 
│ ├── __init__.py 
│ └── bar1.py 
└── app.py 

を持っているとしましょう

あなたが言うとき:

import foo.foo1 
あなたはfoo2はですべてのものを取るとapp.py.と同じ名前空間にして、それをダンプ言っている

from foo.foo2 import * 

を:

あなたが言うとき、私は唯一のfoo1.py

の内容を欲しいと言っています

シナリオ1では、すべての通話を非常に具体的に限定する必要があります。シナリオ3

function()

foo.foo1.function()

シナリオで

foo1.function()

それはナイスミドルアースであるとするのに役立ちますよう理想的には、シナリオ2を使用したことになります名前空間の汚染を防ぎます。

+0

だから 'import foo1.function()'は 'foo2.py'や' bar1.py'をインポートしませんか? – graffaner

+0

あなたはそれをすることすらできません... foo1だけをインポートし、他のものはインポートしないで 'import foo.foo1'と言う必要があります。 –

+0

'foo.foo1からimport function()'を実行できますか? – graffaner

3

はい、機能全体がインポートされます。この関数を含める目的は、主にコードスタイルのためです。これにより、モジュール内の特定の機能だけを使用していることを理解しやすくなります。あなたは

import module 

または

import module.function 
# this is equivalent to "import module" since you will still have to type 
# "module.function()" to use the function. See next answer for correct syntax 

または

from module import function 

を使用するかどうか

は、メモリ/パフォーマンスにほとんど影響しません。

1

This postは、小さな部分のみを使用していてもモジュール全体がインポートされていることを示します。

2

import module.functionは実際にはエラーです。その構文では、関数ではなくサブモジュールのみをインポートできます。

from module import functionはエラーではありません。 from module import functionはモジュール全体を実行します。なぜなら、この関数は、モジュール内の他の関数やモジュールによって実行される任意の設定に任意の複雑な方法で依存する可能性があるからです。

+0

'from numpy import array'は、' numpy'モジュール全体をインポートするのか、サブモジュールだけをインポートするのですか? – graffaner

+0

この質問は、 'numpy'や' scipy'のようなパッケージから関数をインポートするときのメモリフットプリントを減らす方法を見てみることを勧めます。 – graffaner

+0

@graffaner: 'array'はサブモジュールではありません。 'from numpy import random'のようにサブモジュールを実際にインポートするときには、' import numpy'が読み込まれ、 'random'サブモジュールもロードされます。 (NumPyはデフォルトで 'random'を含むサブモジュールのほとんどをロードするので、実際には' import numpy'と同じものがロードされます)。 – user2357112

関連する問題