导入模块(或包)。函数是否实际导入整个模块/包?

3

假设我想要

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 的那个模块文件的一部分?

4个回答

3
是的,它会导入整个函数。包含函数的目的主要是为了代码风格。这样可以更容易地理解您仅在模块中使用了该特定函数。 无论您使用哪种方法来导入模块,Python 都只会在第一次导入时运行模块代码。后续导入将不再运行代码,而是直接从内存缓存中获取已经运行过的模块。
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

对内存/性能几乎没有影响。

2

import module.function 是错误的语法,实际上你只能通过该语法来导入子模块,而不是函数。

from module import function 不是错误的语法。 from module import function 会执行整个模块,因为该函数需要在模块中依赖其他函数或模块的任意复杂设置。


当使用from numpy import array时,是整个numpy模块被导入还是只有一个子模块? - graffaner
我提出这个问题是想了解如何在导入numpyscipy等包中的函数时减少内存占用。 - graffaner
@graffaner:array不是子模块。当您实际导入子模块时,例如from numpy import random,它会加载所有import numpy加载的内容,并且还会加载random子模块。(NumPy默认加载大多数子模块,包括random,因此这实际上会加载与import numpy加载的完全相同的内容。) - user2357112

2
假设你有以下结构。
app/
├── foo/
│   ├── __init__.py
│   ├── foo1.py
│   └── foo2.py
├── bar/
│   ├── __init__.py
│   └── bar1.py
└── app.py

当你在 app.py 中说

import foo

你说要在app.py中使用foo文件夹下的所有py文件。
你的意思是:
import foo.foo1

你说我只想要foo1.py的内容。
当你说:
from foo.foo2 import *

你说的是将foo2中的所有内容转移到与app.py相同的命名空间中。
在方案1中,你必须非常具体地限定所有调用。 foo.foo1.function() 在方案2中, foo1.function() 在方案3中, function() 理想情况下,你应该使用方案2,因为它是一个不错的折中方案,有助于防止命名空间污染。

那么 import foo1.function() 不会导入 foo2.pybar1.py 吗? - graffaner
你甚至不能这样做... 你必须说 import foo.foo1,这将只导入foo1而不是其他的。 - Mike Tung
我可以这样做吗:from foo.foo1 import function() - graffaner
是的,你可以这样做,将foo1.function()引入到你的app.py命名空间中,这样你就可以像调用function()一样调用它。 - Mike Tung
当我执行 from numpy import array 时,整个 numpy 库会被加载。但是,numpy 库的文件结构不应该与您所展示的类似吗?因此,只有包含 array 的模块应该被加载。除非 numpy 中的核心类和函数都在一个单独的 .py 文件中,但我对此表示怀疑。 - graffaner

1

这篇文章 表明即使你只使用了一个小部分,整个模块仍然会被导入。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接