2024-05-20 05:28:22 发布
网友
就速度和内存效率而言,在函数中导入Python模块和/或函数的利弊是什么?
它是在每次运行函数时重新导入,还是在开始时只导入一次,无论函数是否运行?
当您第一次从任何地方(函数内部或外部)进行import goo时,goo.py(或其他可导入的形式)将被加载,并将sys.modules['goo']设置为这样生成的模块对象。在程序的同一次运行中的任何未来导入(同样,无论是在函数内部还是外部)只需查找sys.modules['goo'],并将其绑定到适当范围内的barenamegoo。dict查找和名称绑定是非常快速的操作。
import goo
goo.py
sys.modules['goo']
goo
假设第一个import在程序运行过程中被完全分摊,那么“适当范围”是模块级意味着每次使用goo.this,goo.that等都是两个dict查找——一个用于goo,一个用于属性名。如果是“函数级”,则每次运行函数时会额外支付一个局部变量设置(甚至比字典查找部分更快!)但是为每个goo.this(etc)访问保存一个dict查找(将其替换为本地变量查找,速度非常快),基本上将这种查找所需的时间减半。
import
goo.this
goo.that
我们正在以某种方式讨论几纳秒,所以这几乎不值得优化。在函数中使用import的一个潜在的实质性优势是,在程序的给定运行过程中可能根本不需要该函数,例如,该函数通常处理错误、异常和罕见情况;如果是这样,任何不需要该功能的运行甚至都不会执行导入(这是节省微秒,而不仅仅是纳秒),只有真正需要该功能的运行才会付出(适度但可测量的)代价。
这仍然是一个优化,只有在非常极端的情况下才有价值,在试图用这种方式挤出微秒之前,我会考虑很多其他的优化。
Does it re-import every time the function is run?
不;或者更确切地说,Python模块在每次导入时基本上都是缓存的,因此导入第二个(或第三个或第四个…)时间实际上并不强迫它们再次经历整个导入过程。1
Does it import once at the beginning whether or not the function is run?
不,它只在函数执行时导入。2,3
至于好处:我想这要看情况了。如果您可能只很少运行一个函数,并且不需要在其他任何地方导入模块,那么可能有利于只在该函数中导入它。或者,如果存在名称冲突或其他原因,您不希望模块中的一个或多个符号在任何地方都可用,您可能只希望将其导入到特定函数中。(当然,对于那些情况,总是有from my_module import my_function as f。)
from my_module import my_function as f
一般来说,这可能没什么好处。实际上,大多数Python风格的指南鼓励程序员将所有导入放在模块文件的开头。
当函数第一次执行时导入一次。
优点:
缺点:
当您第一次从任何地方(函数内部或外部)进行
import goo
时,goo.py
(或其他可导入的形式)将被加载,并将sys.modules['goo']
设置为这样生成的模块对象。在程序的同一次运行中的任何未来导入(同样,无论是在函数内部还是外部)只需查找sys.modules['goo']
,并将其绑定到适当范围内的barenamegoo
。dict查找和名称绑定是非常快速的操作。假设第一个
import
在程序运行过程中被完全分摊,那么“适当范围”是模块级意味着每次使用goo.this
,goo.that
等都是两个dict查找——一个用于goo
,一个用于属性名。如果是“函数级”,则每次运行函数时会额外支付一个局部变量设置(甚至比字典查找部分更快!)但是为每个goo.this
(etc)访问保存一个dict查找(将其替换为本地变量查找,速度非常快),基本上将这种查找所需的时间减半。我们正在以某种方式讨论几纳秒,所以这几乎不值得优化。在函数中使用
import
的一个潜在的实质性优势是,在程序的给定运行过程中可能根本不需要该函数,例如,该函数通常处理错误、异常和罕见情况;如果是这样,任何不需要该功能的运行甚至都不会执行导入(这是节省微秒,而不仅仅是纳秒),只有真正需要该功能的运行才会付出(适度但可测量的)代价。这仍然是一个优化,只有在非常极端的情况下才有价值,在试图用这种方式挤出微秒之前,我会考虑很多其他的优化。
不;或者更确切地说,Python模块在每次导入时基本上都是缓存的,因此导入第二个(或第三个或第四个…)时间实际上并不强迫它们再次经历整个导入过程。1
不,它只在函数执行时导入。2,3
至于好处:我想这要看情况了。如果您可能只很少运行一个函数,并且不需要在其他任何地方导入模块,那么可能有利于只在该函数中导入它。或者,如果存在名称冲突或其他原因,您不希望模块中的一个或多个符号在任何地方都可用,您可能只希望将其导入到特定函数中。(当然,对于那些情况,总是有
from my_module import my_function as f
。)一般来说,这可能没什么好处。实际上,大多数Python风格的指南鼓励程序员将所有导入放在模块文件的开头。
当函数第一次执行时导入一次。
优点:
缺点:
相关问题 更多 >
编程相关推荐