这两个问题涉及在函数内部使用import
与在模块顶部使用import
。我不需要被说服将我的导入放在顶部,有很好的理由这样做。然而,为了更好地理解技术问题,我想提出一个后续问题。
通过使用闭包并仅在第一次运行函数时进行导入,您是否可以在性能方面获得最佳效果?
具体而言,假设您有如下代码:
import sys
def get_version():
return sys.version
您希望只有在调用函数时才发生导入,因此将其移至函数内部:
def get_version():
import sys
return sys.version
但是如果它被频繁调用,现在会变得很慢,因此您尝试了一些更复杂的东西:
def _get_version():
import sys
def nested():
return sys.version
global get_version
get_version = nested
return nested()
get_version = _get_version
现在至少一个基本的性能测试表明,这个最后的选项比第一个选项稍微慢一些(需要大约110%的时间),但比第二个选项快得多(只需要大约20%的时间)。
首先,这是否真的有效?我的测量是否准确地描述了第二个示例执行更多工作,还是这只是我测量方式的产物。
其次,在闭包中是否存在减速-除了第一次运行函数的时间之外?
functools
中的lru_cache
装饰器。不确定是否是一个好主意,但它会在第一次运行后缓存函数的结果。 - sytechlru_cache
缓存测试非常耗费资源,我怀疑对于像导入这样轻量级的操作,它不会带来太多性能提升(一旦完成初始文件加载后,导入操作只是绑定一个名称而已)。 - Martijn Pieters