你可以使用闭包优化进口函数吗?
这两个问题涉及使用函数内部的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%)。
首先,这实际上工作吗? 我的测量结果是否准确地表明第二个例子能够做更多的工作,或者它是我如何衡量事物的人为因素。
其次,封闭速度是否会放缓?超出第一次功能运行的时间?
关闭解引用并不比全局查找更快:
>>> import sys
>>> sys.version_info
sys.version_info(major=3, minor=6, micro=0, releaselevel='final', serial=0)
>>> from timeit import timeit
>>> glob = 'foo'
>>> def f1(): return glob
...
>>> def closure():
... closed_over = 'bar'
... def f2():
... return closed_over
... return f2
...
>>> f2 = closure()
>>> timeit(f1, number=10**7)
0.8623221110319719
>>> timeit(f2, number=10**7)
0.872071701916866
此外,即使速度更快,与可读性的权衡也不值得,当您需要优化代码时,更快的选项可用。
当地人是最快的选择,总是,如果你确实需要优化从紧密循环调用的代码,那么正确的混合使用函数参数默认值:
import sys.version
def get_version(_sys_version=sys.version):
return _sys_version
如果您担心启动时导入的初始文件加载的影响,您可能应该查看py-demandimport
项目,它会延迟加载模块直到第一次使用它们。
上一篇: Can you optimize imports in functions using closures?
下一篇: Make a Line between two elements using CSS and JavaScript