擅长:python、mysql、java
<p><strong>请注意,由于之前在我的测试代码中发现了一个错误,我原来的答案是不正确的。修订版如下。</strong></p>
<p>我做了一个小程序来测量运行时间和内存消耗。我创建了以下可调用类和一个闭包:</p>
<pre><code>class CallMe:
def __init__(self, context):
self.context = context
def __call__(self, *args, **kwargs):
return self.context(*args, **kwargs)
def call_me(func):
return lambda *args, **kwargs: func(*args, **kwargs)
</code></pre>
<p>我定时调用接受不同数量参数的简单函数(<code>math.sqrt()</code>有1个参数,<code>math.pow()</code>有2个参数,<code>max()</code>有12个参数)。在</p>
<p>我在Linux x64上使用了CPython 2.7.10和3.4.3+。我只能在python2上进行内存评测。我使用的源代码是可用的<a href="https://gist.github.com/kwikwag/1dc6ecf2688bb03cd4c062a654d0bad3" rel="nofollow noreferrer">here</a>。在</p>
<p>我的结论是:</p>
<ul>
<li>闭包的运行速度比等效的可调用类快:在Python2上大约快3倍,但在Python3上只快1.5倍。缩小是因为闭包变慢了,可调用类变慢了。在</li>
<li>闭包比等效的可调用类占用更少的内存:大约是内存的2/3(仅在Python2上测试)。在</li>
<li>虽然不是原始问题的一部分,但有趣的是,通过闭包进行的调用的运行时开销与对<code>math.pow()</code>的调用大致相同,而通过可调用类的运行时开销大约是这个值的两倍。在</li>
</ul>
<p>这些都是非常粗略的估计,它们可能会因硬件、操作系统和所比较的功能而有所不同。但是,它可以让您了解使用各种可调用的影响。在</p>
<p>因此,这支持了(与我之前写的相反),由@RaymondHettinger给出的接受答案是正确的,并且闭包应该优先用于间接调用,至少只要它不妨碍可读性。另外,感谢@AXO指出了我原始代码中的错误。在</p>