Performance of list vs. set equality operations
Gabriel Genellina
gagsl-py2 at yahoo.com.ar
Thu Apr 8 19:35:15 EDT 2010
En Thu, 08 Apr 2010 04:07:53 -0300, Steven D'Aprano
<steven at remove.this.cybersource.com.au> escribió:
> On Wed, 07 Apr 2010 20:14:23 -0700, Raymond Hettinger wrote:
>> [Raymond Hettinger]
>>> > If the two collections have unequal sizes, then both ways immediately
>>> > return unequal.
>>
>> [Steven D'Aprano]
>>> Perhaps I'm misinterpreting what you are saying, but I can't confirm
>>> that behaviour, at least not for subclasses of list:
>>
>> For doubters, see list_richcompare() in
>> http://svn.python.org/view/python/trunk/Objects/listobject.c?
> revision=78522&view=markup
>
> So what happens in my example with a subclass that (falsely) reports a
> different length even when the lists are the same?
>
> I can guess that perhaps Py_SIZE does not call the subclass __len__
> method, and therefore is not fooled by it lying. Is that the case?
Yes. Py_SIZE is a generic macro, it returns the ob_size field from the
object structure. No method is called at all.
Another example: the print statement bypasses the sys.stdout.write()
method and calls directly fwrite() at the C level when it determines that
sys.stdout is a `file` instance. Even if it's a subclass of file, so
overriding write() in Python code does not work.
The CPython source contains lots of shortcuts like that. Perhaps the
checks should be stricter in some cases, but I imagine it's not so easy to
fix: lots of code was written in the pre-2.2 era, assuming that internal
types were not subclassable.
--
Gabriel Genellina
More information about the Python-list
mailing list