在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))
但使用上述代码进行测试的结果显示len()
更快。为什么呢?
答案 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__
涉及字典查找。