为什么Python的'len'函数比__len__方法更快?

Ωme*_*ega 18 python python-internals

在Python中,len是一个通过调用对象的__len__方法来获取集合长度的函数:

def len(x):
    return x.__len__()
Run Code Online (Sandbox Code Playgroud)

所以我希望直接呼叫__len__()至少能够达到最快速度len().

import timeit

setup = '''
'''

print (timeit.Timer('a="12345"; x=a.__len__()', setup=setup).repeat(10))
print (timeit.Timer('a="12345"; x=len(a)',      setup=setup).repeat(10))
Run Code Online (Sandbox Code Playgroud)

演示链接

但使用上述代码进行测试的结果显示len()更快.为什么?

Mar*_*ers 37

内置len()函数不会查找.__len__属性.它查找tp_as_sequence指针,而指针又具有sq_length属性.

.__len__内置对象的属性间接映射到同一个插槽,而间接(加上属性查找)需要花费更多时间.

对于Python定义的类,该type对象.__len__sq_length请求时查找该方法.