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

时间:2013-11-30 16:21:06

标签: python python-internals

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

def len(x):
    return x.__len__()

所以我希望直接调用__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))

Demo link

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

2 个答案:

答案 0 :(得分:34)

内置len()函数不会查找.__len__属性。它会查找tp_as_sequence pointer,而后者又会sq_length attribute

内置对象的.__len__属性是间接mapped to the same slot,而间接(加上属性查找)需要花费更多时间。

对于Python定义的类,type对象在请求.__len__时查找sq_length方法。

答案 1 :(得分:0)

__len__len()慢,因为__len__ 涉及字典查找。