【问题标题】:Speed dict mapping vs if elif速度 dict 映射与 if elif
【发布时间】:2015-12-06 19:52:20
【问题描述】:

我有一个实现为lambdaif elif ... 的函数,并比较了执行时间:

light = lambda c, v: {'turn on': 1,
                      'turn off': 0,
                      'toggle': (v+1)%2}[c]

def l(c, v):
    if c == 'turn on':
        return 1
    elif c == 'turn off':
        return 0
    elif c == 'toggle':
        return (v+1)%2
    return v

t = Timer(lambda: light('turn on', 0))
print('light: ' + str(t.timeit(number=23163958)))

t = Timer(lambda: l('turn on', 0))
print('l: ' + str(t.timeit(number=23163958)))

输出是:

light: 8.976719211001182
l: 3.9458757909887936

为什么if 语句几乎快两倍?是否有可能进一步提高性能?我必须执行该函数超过 2300 万次。

据此,我认为 dict 查找会更快:https://stackoverflow.com/a/15925086/2014080

【问题讨论】:

  • 它不仅仅是条件和字典查找之间的区别,它的 lambda id 想象的开销
  • 将 dict 放入函数 def 同样慢。
  • 你为什么决定 lambda 会更快?

标签: python


【解决方案1】:

问题是每次调用 lambda 都会再次实例化字典,这需要时间。如果字典只是被引用而不是创建,它的运行速度比条件语句快。

一些简化的代码来说明这一点。

from timeit import Timer

d = {'turn on': 1, 'turn off': 0}

light = lambda c : d[c]

t = Timer(lambda: light('turn on'))
print('light: ' + str(t.timeit(number=23163958)))

# light: 3.66314601898

【讨论】:

  • 啊,好吧,这是有道理的。但是在d 中,无法引用我在toggle 中使用的v。所以 dict 在这里可能不是最好的选择,或者我可以在你的解决方案中以某种方式使用 v 吗?
  • 我无法立即想到包含 v 的方法,但很可能有更好的方法。
  • @amuttsch 字典越大,性能差异就越大。两个元素的 dict 可能比简单的 if .. else 慢——一个千元素的 dict 会比千元素的 if .. elif dropthrough 方式快,
  • light = {'turn on': lambda x: 1, 'turn off': lambda x: 0, 'toggle': lambda x: (x+1)%2} 也可以,甚至比“f”语句还要快一点。感谢您的解释,我之前的代码遇到了问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2020-12-07
相关资源
最近更新 更多