23

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()れています。なんで?

4

3 に答える 3

45

組み込み関数は属性len()を検索しません。これは、属性を持つポインタ.__len__を検索します。tp_as_sequencesq_length

.__len__組み込みオブジェクトの属性は間接的に同じ slotにマップされ、その間接化 (および属性ルックアップ) により時間がかかります。

Python 定義のクラスの場合、typeオブジェクトは が要求された.__len__ときにメソッドを検索します。sq_length

于 2013-11-30T16:31:23.470 に答える