导入整个模块或导入某个功能有啥区别? [复制]

Posted

技术标签:

【中文标题】导入整个模块或导入某个功能有啥区别? [复制]【英文标题】:what is the difference between importing the whole module or importing a certain function? [duplicate]导入整个模块或导入某个功能有什么区别? [复制] 【发布时间】:2020-11-10 23:39:22 【问题描述】:

我一直在问自己,为什么有办法从模块中导入某个函数, 示例:从 tkinter 导入 ttk

而不是仅仅导入整个模块,--> import tkinter

它会让程序运行得更快吗?

【问题讨论】:

它不会使程序运行得更快。但这使您的代码更加简洁,如果您使用import tkinter,那么您必须在代码中将每次使用ttk 前缀为tkinter.ttk,而如果您使用from tkinter import ttk,则可以直接在代码中使用ttk 这能回答你的问题吗? Use 'import module' or 'from module import'? 这可能不应该被标记为 tkinter。 【参考方案1】:

如果你使用timeit 来测试它们:

import timeit

print(timeit.Timer('''
from tkinter import ttk
''').timeit())
# 0.47940059999999995

print(timeit.Timer('''
import tkinter
''').timeit())
# 0.09511329999999996

导入完整模块会比只导入特定模块更快。

它们的内存使用情况(由memory_profiler测试):

from tkinter import ttk


Line #    Mem usage    Increment   Line Contents
================================================
     1   18.719 MiB   18.719 MiB   @profile
     2                             def test():
     3   21.297 MiB    2.578 MiB       from tkinter import ttk
                       (>2.6)

还有:

import tkinter

Line #    Mem usage    Increment   Line Contents
================================================
     1   18.676 MiB   18.676 MiB   @profile
     2                             def test():
     3   21.070 MiB    2.395 MiB       import tkinter
                       (<=2.5M)

如果你只导入特定的属性。它会比导入完整的模块更快(一点点):

import timeit

print(timeit.Timer('''
math.sqrt(4)
''', setup="import math").timeit())
# 0.10590600000000006

print(timeit.Timer('''
sqrt(4)
''', setup="from math import sqrt").timeit())
# 0.08237790000000011

使用from tkinter import ttk只是为了方便。如果我们想使用一些子属性,我们不需要输入完整的模块名称。您可以在该问题上了解更多differences。

PS:我认为这个开销不是什么大问题。

【讨论】:

【参考方案2】:

没有内存或速度差异(必须以任何一种方式评估整个模块,因为最后一行可能是 Y = something_else)。只有在循环中多次调用函数(数百万或更多)才重要。做双重字典查找最终会累积。

虽然 import tkinterfrom tkinter import ttk 都导入了整个 tkinter 模块,但后者使用名称绑定,因此其余代码只能访问 ttk。 p>

对于某些人来说,这将是首选样式,因为它只能访问您明确声明的功能。

但它确实会引入潜在的名称冲突。请注意,您还可以显式导入函数并使用 from tkinter import ttk as tkinter_ttk 重命名它们,这是一种符合显式导入且不太可能产生命名空间冲突的约定。

【讨论】:

【参考方案3】:

这并没有实际的区别, 但它确实有所作为,无论多么小。 这是因为在 import x 版本中有两个名称查找:一个用于模块名称,第二个用于函数名称;另一方面,使用 from x import y,您只有一次查找。

看看这个Python import X or from X import Y? (performance)

【讨论】:

任何形式的import 读取并执行整个模块。不同形式的不同之处在于将模块中的哪些名称添加到您的命名空间中。

以上是关于导入整个模块或导入某个功能有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

将 python 模块导入例程或类定义有啥问题吗? [复制]

import modx 和 from modx import * 有啥区别? [复制]

python模块导入的方法与区别

python中动态导入模块

Java中的类导入和包导入有啥区别? [复制]

包和导入有啥区别? [复制]