为什么'in'比`__contains__`更快?

Agu*_*guy 0 python

我认为这in只是一个表现__contains__

In [1]: li = [1, 2, 3, 4, 5]

In [2]: 4 in li
Out[2]: True

In [3]: li.__contains__(4)
Out[3]: True
Run Code Online (Sandbox Code Playgroud)

in速度要快2倍

In [4]: %timeit 4 in li
10000000 loops, best of 3: 103 ns per loop

In [5]: %timeit li.__contains__(4)
The slowest run took 10.06 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 213 ns per loop
Run Code Online (Sandbox Code Playgroud)

你能解释两者之间的差异in吗?为什么更快?

Mos*_*oye 5

可能同样的原因{}是为了更快dict().方法调用引入了额外的开销:

>>> from dis import dis
>>> li = [1, 2, 3, 4, 5]
>>> c = lambda: 4 in li
>>> d = lambda: li.__contains__(4)
>>> dis(c)
  1           0 LOAD_CONST               1 (4)
              3 LOAD_GLOBAL              0 (li)
              6 COMPARE_OP               6 (in)
              9 RETURN_VALUE
>>> dis(d)
  1           0 LOAD_GLOBAL              0 (li)
              3 LOAD_ATTR                1 (__contains__)
              6 LOAD_CONST               1 (4)
              9 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
             12 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)

CALL_FUNCTION后面的例子.

  • 这并不能解释为什么`in`没有相同的方法调用开销. (2认同)