6 python performance closures function decorator
看看构造我的函数的两种方法:
class myClass:
def _myFunc(self):
pass
def myFunc2(self):
self._myFunc()
class myClass:
def myFunc2(self):
def myFunc():
pass
myFunc()
Run Code Online (Sandbox Code Playgroud)
第二种选择会慢吗?我只需要从myFunc2调用myFunc,所以我想将它隐藏在我的模块文档中,我可以使用下划线,但我认为将它放在函数中会更清晰.另一方面,我可能需要每秒调用myFunc2几百次,因此每次调用myFunc2时"重新定义"myFunc可能会很慢......这是一个很好的猜测吗?
在64位Ubuntu上使用Python 2.6.5,没有明显的区别:
# version 1
In [2]: %timeit c1.myFunc2()
1000000 loops, best of 3: 461 ns per loop
# version 2
In [3]: %timeit c2.myFunc2()
1000000 loops, best of 3: 464 ns per loop
Run Code Online (Sandbox Code Playgroud)
第二个变体中的本地函数不会被一遍又一遍地编译——它与整个文件一起编译一次,并且它的主体存储在代码对象中。在执行外部函数期间发生的唯一事情是代码对象被包装在一个新的函数对象中,然后该函数对象绑定到本地名称myFunc。
如果采用默认参数,两个变体之间可能存在差异myFunc()。他们的定义将在第二个变体中一遍又一遍地执行,从而可能导致性能下降。
夸张的例子:
from time import sleep
class MyClass:
def _my_func(self, x=sleep(1)):
pass
def my_func2(self):
self._my_func()
class MyClass2:
def my_func2(self):
def my_func(x=sleep(1)):
pass
my_func()
Run Code Online (Sandbox Code Playgroud)
使用上面的愚蠢代码,myClass.myFunc2()将立即返回,而myClass2.myFunc2()需要一秒钟才能执行。