Skip to content
Advertisement

Why is Python’s ‘len’ function faster than the __len__ method?

In Python, len is a function to get the length of a collection by calling an object’s __len__ method:

JavaScript

So I would expect direct call of __len__() to be at least as fast as len().

JavaScript

Demo link

But results of testing with the above code shows len() to be faster. Why?

Advertisement

Answer

The builtin len() function does not look up the .__len__ attribute. It looks up the tp_as_sequence pointer, which in turn has a sq_length attribute.

The .__len__ attribute on built-in objects is indirectly mapped to the same slot, and it is that indirection (plus the attribute lookup) that takes more time.

For Python-defined classes, the type object looks up the .__len__ method when the sq_length is requested.

Advertisement