2017-05-05 122 views
3

說我要確實導入模塊(或包).function實際導入整個模塊/包?

import module.function 

它實際進口全module到內存中,而不是僅僅的function

我想問這個問題,因爲我認爲只從模塊導入我需要的功能可以減少內存消耗。

編輯
澄清我的問題,並要求其在以下兩個背景:
1. import module.function1其中module是一個module.py文件,其中包含function1等功能的定義和類別定義等是整個module裝進入內存或只是function1定義的一部分?
2. import package.function1其中package是一個像numpy這樣的包,其中包含文件層次結構,如下面描述的Mike Tung。整個程序包是否加載到內存中,或者只是包含function1定義的模塊文件,或者只是定義function1的模塊文件的一部分?

回答

2

比方說,你有以下結構

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

當您在app.py

import foo 

你說的導入所有的PY文件下FOO用於app.py

當你說:

import foo.foo1 

你說你說我只想foo1.py

的內容:

from foo.foo2 import * 

你說把所有的東西在foo2的和轉儲它相同的命名空間app.py.

在場景1中,您必須非常明確地限定您的所有通話。

foo.foo1.function()

在方案2中

foo1.function()

在方案3

function()

理想情況下,你會使用方案2,因爲它是一個很好的中間地帶,並幫助防止命名空間污染。

+0

so'import foo1.function()'不會導致'foo2.py'或'bar1.py'被導入? – graffaner

+0

你甚至不能這樣做......你必須說'import foo.foo1',它只會導入foo1,而不導入其他的。 –

+0

我可以'從foo.foo1導入函數()'嗎? – 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

所以當'從numpy進口數組',是整個'numpy'模塊導入還是隻有一個子模塊? – graffaner

+0

我問這個問題試圖看看如何從'numpy'和'scipy'等軟件包中導入函數時如何減少內存佔用。 – graffaner

+0

@graffaner:'array'不是子模塊。至於你什麼時候導入一個子模塊,比如'numpy import random',它會加載所有'import numpy'加載並且加載'random'子模塊。 (NumPy在默認情況下會加載大部分子模塊,包括'random',所以這實際上會加載'import numpy'加載完全相同的東西。) – user2357112