擅长:python、mysql、java
<p>基本答案是,这三个选项中的任何一个都可能是“最佳”的,具体取决于具体情况。但是您所选择的选项之间的差异是微妙的,并且在大多数情况下不太可能显著影响性能。与其在这里担心效率,不如担心概念上的优雅。然后,如果你<em>需要</em>效率,优化。你知道吗</p>
<p>我可以想象,从概念上讲,这三种选择中的任何一种都是可取的。你知道吗</p>
<ol>
<li><p>假设函数的选择取决于一个经常变化的值。您必须经常检查它的状态,那么存储它会有什么好处呢?只要每次都查一下就更有意义了。在这种情况下,(1)是最好的选择。</p></li>
<li><p>假设函数的选择不会基于一个经常改变的值,或者一个易于“反转控制”的值(即关注变量的代码也知道如何改变函数的选择)。除非您有压倒一切的理由担心单个<code>.</code>访问的额外开销,否则只需将其存储为属性。(请注意,在<code>self</code>中查找属性的成本并不比在其他对象中查找属性的成本高。操作完全相同;<code>self</code>没有什么特别之处在这种情况下,(2)是最好的选择。</p></li>
<li><p>假设函数的选择不会基于经常更改的值,而是函数本身会经常被调用。此外,<em>您确信<code>.</code>访问正在减慢代码的速度,因为您已经<em>完成了严格的测试</em>。然后将<code>.</code>访问的结果缓存在局部变量中是有意义的,如选项(3)所示。(但请注意,在选项(3)中,您仍然在使用另一个<code>.</code>操作,该操作也应该被缓存,就像在Ignacio的回答中一样。)但是要小心过早的优化!每一个局部变量都会给您和您的开发人员带来额外的认知负荷,您必须确保这是值得的。<em>只有</em>如果你真的做过测试的话,才选择这个选项,这会造成显著的速度差异。</p></li>
</ol>
<p>最后一点注意:在您的示例代码中还有一些额外的复杂性,我假设这些复杂性应该是为了唤起复杂性,而不是在这种特殊情况下的特定目的。例如,给定您实际发布的代码,<code>choose_function_given_choice</code>函数是非常无用的。但我想你已经知道了。不过,要重申显而易见的一点,你应该以最简单的方式实现这一切。你知道吗</p>