【问题标题】:Reference function or create a new function that only calls another?引用函数还是创建一个只调用另一个函数的新函数?
【发布时间】:2026-02-25 06:00:02
【问题描述】:
def a(something):
    return something*something

#Case I - referencing
b = a
#Case II - creating a new function to call the first
def b(something):
    return a(something)

哪种风格更好?两者都有缺点吗?

【问题讨论】:

  • 你为什么要做这些,而不是仅仅通过它的名字来引用?
  • 我正在制作一种插件类型的东西,其中每个模块都需要实现某个模块,但可能会使用适用于大多数情况的预制模块。

标签: python function coding-style


【解决方案1】:

取决于你需要什么。

def a(something):
    return something*something

b = a

def a(something):
    return something+something

>>> b(3)
9
>>> a(3)
7

如果你这样做了:

b = lambda x:a(x)

b 和 a 总是返回相同的

如果你想优化一个额外的函数调用第一种方法更好,如果你想让 b 和 a 总是返回相同的东西,第二种方法更好。

【讨论】:

  • ...而且我认为在大多数情况下,额外的函数调用不值得优化。
【解决方案2】:

b = a 意味着对b 的调用会更快(没有开销),但内省(例如help(b))将显示名称aa 的文档字符串。除非后一个问题是您的特定应用程序的杀手(例如某种教程),否则速度优势通常会胜出。

考虑一下,例如在 ref.py 中:

def a(something):
    return something*something

#Case I - referencing
b1 = a
#Case II - creating a new function to call the first
def b2(something):
    return a(something)

现在:

$ python -mtimeit -s'import ref' 'ref.a(23)'
1000000 loops, best of 3: 0.716 usec per loop
$ python -mtimeit -s'import ref' 'ref.b1(23)'
1000000 loops, best of 3: 0.702 usec per loop
$ python -mtimeit -s'import ref' 'ref.b2(23)'
1000000 loops, best of 3: 0.958 usec per loop

即,对b1(纯引用)的调用与对a 的调用一样快(实际上在这次运行中看起来快了2%,但这完全在测量的“噪音”范围内;-),调用b2(内部调用 a 的全新函数)会产生 20% 的开销——这不是杀手,但通常是要避免的,除非牺牲性能为您购买了对您的用例非常重要的特定内容。

【讨论】:

    【解决方案3】:

    先不生成新函数,应该会更好。

    【讨论】:

      【解决方案4】:

      函数调用会产生开销。案例一更快。案例二创建新的函数无关函数。

      为什么需要案例 II?

      【讨论】: