Is there any case where len(someObj) does not call someObj's __len__ function?

If __len__ returns a length over sys.maxsize, len() will raise an exception. This isn't true of calling __len__ directly. (In fact you could return any object from __len__ which won't be caught unless it goes through len().)


What kind of speedup did you see? I cannot imagine it was noticeable was it?

From http://mail.python.org/pipermail/python-list/2002-May/147079.html

in certain situations there is no difference, but using len() is preferred for a couple reasons.

first, it's not recommended to go calling the __methods__ yourself, they are meant to be used by other parts of python.

len() will work on any type of sequence object (lists, tuples, and all). __len__ will only work on class instances with a __len__ method.

len() will return a more appropriate exception on objects without length.


I think the answer is that it will always work -- according to the Python docs:

__len__(self):

Called to implement the built-in function len(). Should return the length of the object, an integer >= 0. Also, an object that doesn't define a __nonzero__() method and whose __len__() method returns zero is considered to be false in a Boolean context.