在下面的代码示例中,我有两个更高级别的函数factory1和factory2,它们产生具有相同行为的函数。第一个工厂factory1通过让返回的函数基于工厂的布尔值更改行为来避免必须显式定义两个不同的函数。在此示例中,此方法的用处并不明显,但是如果要生成的函数更加复杂,则显式写出函数的两个几乎相同的副本将对可读性和可维护性均造成不利影响,就像在。但是,如时序结果所示,factory2实现更快。有没有一种方法可以在不显式定义两个替代函数的情况下实现factory2的性能?def factory1(condition): def fn(): if condition: return "foo" else: return "bar" return fndef factory2(condition): def foo_fn(): return "foo" def bar_fn(): return "bar" if condition: return foo_fn else: return bar_fndef test1(): fn = factory1(True) for _ in range(1000): fn()def test2(): fn = factory2(True) for _ in range(1000): fn()if __name__ == '__main__': import timeit print(timeit.timeit("test1()", setup="from __main__ import test1")) # >>> 62.458039999 print(timeit.timeit("test2()", setup="from __main__ import test2")) # >>> 49.203676939编辑:更多上下文我问的原因是我试图产生一个看起来像这样的函数:def function(data): data = some_transform(data) if condition: # condition should be considered invariant at time of definition data = transform1(data) else: data = transform2(data) data = yet_another_transform(data) return data (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 根据“明确定义两个函数”的含义,请注意,在检查条件之后,不必执行def语句:def factory3(condition): if condition: def fn(): return "foo" else: def fn(): return "bar" return fn一个人可能会反对,那就是在确定运行时使用哪个代码对象定义函数之前,仍然必须编译两个代码对象。在这种情况下,您可能会在动态构造的字符串上使用exec后退。注意除了我将在此处显示的静态示例以外,对于其他任何事情,都需要谨慎进行。参见the old definition for namedtuple以获得一个好例子(?)。def factory4(condition): code = """def fn():\n return "{}"\n""".format("foo" if condition else "bar") exec(code) return fn一个更安全的替代方法是使用闭包:def factory5(condition): def make_fun(val): def _(): return val return _ if condition: return make_fun("foo") else: return make_fun("bar")也可以在make_fun之外定义factory5,因为它完全不依赖condition。根据您的编辑,我认为您只是在寻求实现依赖项注入。不要在函数中放入if语句;将transform1或transform2作为参数传递:def function(transform): def _(data): data = some_transform(data) data = transform(data) data = yet_another_transform(data) return data return _if condition: thing = function(transform1)else: thing = function(transform2)关于python - python闭包中的条件性能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56582050/ (adsbygoogle = window.adsbygoogle || []).push({});