【问题标题】:Which is more efficient as the default argument: None or lambda x: x哪个作为默认参数更有效:None 或 lambda x: x
【发布时间】:2019-03-24 11:00:52
【问题描述】:

出于好奇,在没有第二个参数的情况下调用以下函数时,什么更有效?使用 if 语句:

def f(elements, l=None):
    for el in elements:
        ...
        if l:
            el = l(el)
        ...

还是使用 lambda?

def f(elements, l=lambda x: x):
    for el in elements:
        ...
        el = l(el)
        ...

无论如何我都会使用第二个变体,因为当提供了函数参数时,但我仍然对仅使用默认值运行时哪个更有效。

【问题讨论】:

  • 我觉得第一个变体更具可读性(文档也会看起来更好)。如果您担心效率,您可以随时将if 语句放在循环之前(外部)......比较例如与标准库中的sorted 具有完全相同的接口。
  • running %timeit 明显的赢家是带有 if 语句的人
  • @user3496846 我在pycharm附带的pydevcosole中,我刚刚意识到我不知道如何检查我拥有的python 3.6的味道,我认为它是cpython
  • 除了效率问题之外,OP 的第二种方法存在第一种方法没有的弱点:第一种方法将正常工作,无论您是否通过None,或者不通过任何东西所有,作为第二个论点。如果将 None 作为第二个参数传递,则第二种方法将失败,虽然这是一个编程错误,但很可能是这样。
  • 第二个版本效率更高。

标签: python performance optimization


【解决方案1】:

如我的评论中所述:我建议您使用

def f(elements, l=None):
    if l is None:
        l = lambda x: x
    for el in elements:
        el = l(el)

这样您只需要额外的 if 语句,因此没有性能损失(至少在复杂性方面) - 与您需要在循环的每次迭代中进行测试的第一个示例相反。

如果你比较例如使用标准库中的sorted(iterable, *, key=None, ...),这似乎是更标准的接口(注意key=None,它也需要是可调用的——就像你的情况一样)。这将使文档看起来更好,更标准。

或者,如果l 确实是None,则提高效率:

def f(elements, l=None):
    if l is None:
        for el in elements:
            ...
    else:
        for el in elements:
            el = l(el)
            ...

【讨论】:

  • 那么推理...?
  • @deceze 我了解 OP 担心 if 语句在循环内会导致效率损失。并且(如上面的评论中所述 - 但也许这也应该成为答案 - 文档看起来会更好,更具可读性)。
  • 请编辑您的答案以包含此信息; cmets 随时有资格被删除。此外,您的答案应该是独立的。
  • 抱歉,我不明白为什么这比写l=lambda x: x 更好。好像多加了一个if语句,仅此而已。
  • 不要忘记if 语句比函数调用便宜得多,而且 lambda 是函数,即使它们看起来不像
猜你喜欢
  • 1970-01-01
  • 2014-01-13
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 2021-09-17
  • 2016-03-16
  • 2010-09-24
  • 2017-12-09
相关资源
最近更新 更多