« There's got to be a name for thislogging.statistics »

Wow. Does isinstance blow up with ABC's?

02/24/11

Permalink 02:58:42 pm, by fumanchu Email , 1214 words   English (US)
Categories: Python, CherryPy

Wow. Does isinstance blow up with ABC's?

Python 2.6.1. Here's a call to "isinstance(value, basestring)":

--[  (_cprequest:782)
--]  (_cprequest:782)  0.044ms

versus "isinstance(value, io.IOBase)":

--[  (_cprequest:791)
----> __instancecheck__ (abc:117)
----. __instancecheck__ (abc:120)
------[  (abc:120)
------]  (abc:120)  0.046ms
----. __instancecheck__ (abc:121)
----. __instancecheck__ (abc:123)
----. __instancecheck__ (abc:124)
----. __instancecheck__ (abc:125)
----. __instancecheck__ (abc:126)
----. __instancecheck__ (abc:127)
----. __instancecheck__ (abc:130)
------> __subclasscheck__ (abc:134)
------. __subclasscheck__ (abc:137)
------. __subclasscheck__ (abc:140)
------. __subclasscheck__ (abc:144)
------. __subclasscheck__ (abc:147)
--------[ ABCMeta.__subclasshook__ (abc:147)
--------] ABCMeta.__subclasshook__ (abc:147)  0.043ms
------. __subclasscheck__ (abc:148)
------. __subclasscheck__ (abc:156)
--------[  (abc:156)
--------]  (abc:156)  0.043ms
------. __subclasscheck__ (abc:160)
------. __subclasscheck__ (abc:165)
--------[ ABCMeta.__subclasses__ (abc:165)
--------] ABCMeta.__subclasses__ (abc:165)  0.045ms
------. __subclasscheck__ (abc:166)
--------[  (abc:166)
----------> __subclasscheck__ (abc:134)
----------. __subclasscheck__ (abc:137)
----------. __subclasscheck__ (abc:140)
----------. __subclasscheck__ (abc:144)
----------. __subclasscheck__ (abc:147)
------------[ ABCMeta.__subclasshook__ (abc:147)
------------] ABCMeta.__subclasshook__ (abc:147)  0.043ms
----------. __subclasscheck__ (abc:148)
----------. __subclasscheck__ (abc:156)
------------[  (abc:156)
------------]  (abc:156)  0.046ms
----------. __subclasscheck__ (abc:160)
----------. __subclasscheck__ (abc:165)
------------[ ABCMeta.__subclasses__ (abc:165)
------------] ABCMeta.__subclasses__ (abc:165)  0.043ms
----------. __subclasscheck__ (abc:166)
------------[  (abc:166)
--------------> __subclasscheck__ (abc:134)
--------------. __subclasscheck__ (abc:137)
--------------. __subclasscheck__ (abc:140)
--------------. __subclasscheck__ (abc:144)
--------------. __subclasscheck__ (abc:147)
----------------[ ABCMeta.__subclasshook__ (abc:147)
----------------] ABCMeta.__subclasshook__ (abc:147)  0.043ms
--------------. __subclasscheck__ (abc:148)
--------------. __subclasscheck__ (abc:156)
----------------[  (abc:156)
----------------]  (abc:156)  0.043ms
--------------. __subclasscheck__ (abc:160)
--------------. __subclasscheck__ (abc:165)
----------------[ ABCMeta.__subclasses__ (abc:165)
----------------] ABCMeta.__subclasses__ (abc:165)  0.042ms
--------------. __subclasscheck__ (abc:170)
----------------[ set.add (abc:170)
----------------] set.add (abc:170)  0.043ms
--------------. __subclasscheck__ (abc:171)
--------------< __subclasscheck__ (abc:171): False 1.690ms
------------]  (abc:166)  1.887ms
----------. __subclasscheck__ (abc:165)
----------. __subclasscheck__ (abc:170)
------------[ set.add (abc:170)
------------] set.add (abc:170)  0.042ms
----------. __subclasscheck__ (abc:171)
----------< __subclasscheck__ (abc:171): False 3.745ms
--------]  (abc:166)  3.952ms
------. __subclasscheck__ (abc:165)
------. __subclasscheck__ (abc:166)
--------[  (abc:166)
----------> __subclasscheck__ (abc:134)
----------. __subclasscheck__ (abc:137)
----------. __subclasscheck__ (abc:140)
----------. __subclasscheck__ (abc:144)
----------. __subclasscheck__ (abc:147)
------------[ ABCMeta.__subclasshook__ (abc:147)
------------] ABCMeta.__subclasshook__ (abc:147)  0.044ms
----------. __subclasscheck__ (abc:148)
----------. __subclasscheck__ (abc:156)
------------[  (abc:156)
------------]  (abc:156)  0.044ms
----------. __subclasscheck__ (abc:160)
----------. __subclasscheck__ (abc:165)
------------[ ABCMeta.__subclasses__ (abc:165)
------------] ABCMeta.__subclasses__ (abc:165)  0.045ms
----------. __subclasscheck__ (abc:166)
------------[  (abc:166)
--------------> __subclasscheck__ (abc:134)
--------------. __subclasscheck__ (abc:137)
--------------. __subclasscheck__ (abc:140)
--------------. __subclasscheck__ (abc:144)
--------------. __subclasscheck__ (abc:147)
----------------[ ABCMeta.__subclasshook__ (abc:147)
----------------] ABCMeta.__subclasshook__ (abc:147)  0.042ms
--------------. __subclasscheck__ (abc:148)
--------------. __subclasscheck__ (abc:156)
----------------[  (abc:156)
----------------]  (abc:156)  0.043ms
--------------. __subclasscheck__ (abc:160)
--------------. __subclasscheck__ (abc:165)
----------------[ ABCMeta.__subclasses__ (abc:165)
----------------] ABCMeta.__subclasses__ (abc:165)  0.043ms
--------------. __subclasscheck__ (abc:166)
----------------[  (abc:166)
------------------> __subclasscheck__ (abc:134)
------------------. __subclasscheck__ (abc:137)
------------------. __subclasscheck__ (abc:140)
------------------. __subclasscheck__ (abc:144)
------------------. __subclasscheck__ (abc:147)
--------------------[ ABCMeta.__subclasshook__ (abc:147)
--------------------] ABCMeta.__subclasshook__ (abc:147)  0.044ms
------------------. __subclasscheck__ (abc:148)
------------------. __subclasscheck__ (abc:156)
--------------------[  (abc:156)
--------------------]  (abc:156)  0.049ms
------------------. __subclasscheck__ (abc:160)
------------------. __subclasscheck__ (abc:165)
--------------------[ ABCMeta.__subclasses__ (abc:165)
--------------------] ABCMeta.__subclasses__ (abc:165)  0.044ms
------------------. __subclasscheck__ (abc:166)
--------------------[  (abc:166)
----------------------> __subclasscheck__ (abc:134)
----------------------. __subclasscheck__ (abc:137)
----------------------. __subclasscheck__ (abc:140)
----------------------. __subclasscheck__ (abc:144)
----------------------. __subclasscheck__ (abc:147)
------------------------[ ABCMeta.__subclasshook__ (abc:147)
------------------------] ABCMeta.__subclasshook__ (abc:147)  0.043ms
----------------------. __subclasscheck__ (abc:148)
----------------------. __subclasscheck__ (abc:156)
------------------------[  (abc:156)
------------------------]  (abc:156)  0.042ms
----------------------. __subclasscheck__ (abc:160)
----------------------. __subclasscheck__ (abc:165)
------------------------[ ABCMeta.__subclasses__ (abc:165)
------------------------] ABCMeta.__subclasses__ (abc:165)  0.042ms
----------------------. __subclasscheck__ (abc:170)
------------------------[ set.add (abc:170)
------------------------] set.add (abc:170)  0.042ms
----------------------. __subclasscheck__ (abc:171)
----------------------< __subclasscheck__ (abc:171): False 1.574ms
--------------------]  (abc:166)  1.772ms
------------------. __subclasscheck__ (abc:165)
------------------. __subclasscheck__ (abc:170)
--------------------[ set.add (abc:170)
--------------------] set.add (abc:170)  0.042ms
------------------. __subclasscheck__ (abc:171)
------------------< __subclasscheck__ (abc:171): False 4.394ms
----------------]  (abc:166)  4.592ms
--------------. __subclasscheck__ (abc:165)
--------------. __subclasscheck__ (abc:166)
----------------[  (abc:166)
------------------> __subclasscheck__ (abc:134)
------------------. __subclasscheck__ (abc:137)
------------------. __subclasscheck__ (abc:140)
------------------. __subclasscheck__ (abc:144)
------------------. __subclasscheck__ (abc:147)
--------------------[ ABCMeta.__subclasshook__ (abc:147)
--------------------] ABCMeta.__subclasshook__ (abc:147)  0.042ms
------------------. __subclasscheck__ (abc:148)
------------------. __subclasscheck__ (abc:156)
--------------------[  (abc:156)
--------------------]  (abc:156)  0.044ms
------------------. __subclasscheck__ (abc:160)
------------------. __subclasscheck__ (abc:165)
--------------------[ ABCMeta.__subclasses__ (abc:165)
--------------------] ABCMeta.__subclasses__ (abc:165)  0.044ms
------------------. __subclasscheck__ (abc:166)
--------------------[  (abc:166)
----------------------> __subclasscheck__ (abc:134)
----------------------. __subclasscheck__ (abc:137)
----------------------. __subclasscheck__ (abc:140)
----------------------. __subclasscheck__ (abc:144)
----------------------. __subclasscheck__ (abc:145)
----------------------< __subclasscheck__ (abc:145): False 0.350ms
--------------------]  (abc:166)  0.553ms
------------------. __subclasscheck__ (abc:165)
------------------. __subclasscheck__ (abc:170)
--------------------[ set.add (abc:170)
--------------------] set.add (abc:170)  0.043ms
------------------. __subclasscheck__ (abc:171)
------------------< __subclasscheck__ (abc:171): False 2.682ms
----------------]  (abc:166)  2.876ms
--------------. __subclasscheck__ (abc:165)
--------------. __subclasscheck__ (abc:170)
----------------[ set.add (abc:170)
----------------] set.add (abc:170)  0.042ms
--------------. __subclasscheck__ (abc:171)
--------------< __subclasscheck__ (abc:171): False 9.633ms
------------]  (abc:166)  9.855ms
----------. __subclasscheck__ (abc:165)
----------. __subclasscheck__ (abc:166)
------------[  (abc:166)
--------------> __subclasscheck__ (abc:134)
--------------. __subclasscheck__ (abc:137)
--------------. __subclasscheck__ (abc:140)
--------------. __subclasscheck__ (abc:144)
--------------. __subclasscheck__ (abc:147)
----------------[ ABCMeta.__subclasshook__ (abc:147)
----------------] ABCMeta.__subclasshook__ (abc:147)  0.042ms
--------------. __subclasscheck__ (abc:148)
--------------. __subclasscheck__ (abc:156)
----------------[  (abc:156)
----------------]  (abc:156)  0.043ms
--------------. __subclasscheck__ (abc:160)
--------------. __subclasscheck__ (abc:165)
----------------[ ABCMeta.__subclasses__ (abc:165)
----------------] ABCMeta.__subclasses__ (abc:165)  0.043ms
--------------. __subclasscheck__ (abc:170)
----------------[ set.add (abc:170)
----------------] set.add (abc:170)  0.042ms
--------------. __subclasscheck__ (abc:171)
--------------< __subclasscheck__ (abc:171): False 1.562ms
------------]  (abc:166)  1.755ms
----------. __subclasscheck__ (abc:165)
----------. __subclasscheck__ (abc:166)
------------[  (abc:166)
--------------> __subclasscheck__ (abc:134)
--------------. __subclasscheck__ (abc:137)
--------------. __subclasscheck__ (abc:140)
--------------. __subclasscheck__ (abc:144)
--------------. __subclasscheck__ (abc:147)
----------------[ ABCMeta.__subclasshook__ (abc:147)
----------------] ABCMeta.__subclasshook__ (abc:147)  0.043ms
--------------. __subclasscheck__ (abc:148)
--------------. __subclasscheck__ (abc:156)
----------------[  (abc:156)
----------------]  (abc:156)  0.043ms
--------------. __subclasscheck__ (abc:160)
--------------. __subclasscheck__ (abc:165)
----------------[ ABCMeta.__subclasses__ (abc:165)
----------------] ABCMeta.__subclasses__ (abc:165)  0.042ms
--------------. __subclasscheck__ (abc:170)
----------------[ set.add (abc:170)
----------------] set.add (abc:170)  0.043ms
--------------. __subclasscheck__ (abc:171)
--------------< __subclasscheck__ (abc:171): False 1.569ms
------------]  (abc:166)  1.772ms
----------. __subclasscheck__ (abc:165)
----------. __subclasscheck__ (abc:166)
------------[  (abc:166)
--------------> __subclasscheck__ (abc:134)
--------------. __subclasscheck__ (abc:137)
--------------. __subclasscheck__ (abc:140)
--------------. __subclasscheck__ (abc:144)
--------------. __subclasscheck__ (abc:147)
----------------[ ABCMeta.__subclasshook__ (abc:147)
----------------] ABCMeta.__subclasshook__ (abc:147)  0.042ms
--------------. __subclasscheck__ (abc:148)
--------------. __subclasscheck__ (abc:156)
----------------[  (abc:156)
----------------]  (abc:156)  0.043ms
--------------. __subclasscheck__ (abc:160)
--------------. __subclasscheck__ (abc:165)
----------------[ ABCMeta.__subclasses__ (abc:165)
----------------] ABCMeta.__subclasses__ (abc:165)  0.042ms
--------------. __subclasscheck__ (abc:170)
----------------[ set.add (abc:170)
----------------] set.add (abc:170)  0.042ms
--------------. __subclasscheck__ (abc:171)
--------------< __subclasscheck__ (abc:171): False 1.647ms
------------]  (abc:166)  1.842ms
----------. __subclasscheck__ (abc:165)
----------. __subclasscheck__ (abc:170)
------------[ set.add (abc:170)
------------] set.add (abc:170)  0.043ms
----------. __subclasscheck__ (abc:171)
----------< __subclasscheck__ (abc:171): False 18.252ms
--------]  (abc:166)  18.443ms
------. __subclasscheck__ (abc:165)
------. __subclasscheck__ (abc:166)
--------[  (abc:166)
----------> __subclasscheck__ (abc:134)
----------. __subclasscheck__ (abc:137)
----------. __subclasscheck__ (abc:140)
----------. __subclasscheck__ (abc:144)
----------. __subclasscheck__ (abc:147)
------------[ ABCMeta.__subclasshook__ (abc:147)
------------] ABCMeta.__subclasshook__ (abc:147)  0.043ms
----------. __subclasscheck__ (abc:148)
----------. __subclasscheck__ (abc:156)
------------[  (abc:156)
------------]  (abc:156)  0.044ms
----------. __subclasscheck__ (abc:160)
----------. __subclasscheck__ (abc:165)
------------[ ABCMeta.__subclasses__ (abc:165)
------------] ABCMeta.__subclasses__ (abc:165)  0.044ms
----------. __subclasscheck__ (abc:166)
------------[  (abc:166)
--------------> __subclasscheck__ (abc:134)
--------------. __subclasscheck__ (abc:137)
--------------. __subclasscheck__ (abc:140)
--------------. __subclasscheck__ (abc:144)
--------------. __subclasscheck__ (abc:147)
----------------[ ABCMeta.__subclasshook__ (abc:147)
----------------] ABCMeta.__subclasshook__ (abc:147)  0.044ms
--------------. __subclasscheck__ (abc:148)
--------------. __subclasscheck__ (abc:156)
----------------[  (abc:156)
----------------]  (abc:156)  0.043ms
--------------. __subclasscheck__ (abc:160)
--------------. __subclasscheck__ (abc:165)
----------------[ ABCMeta.__subclasses__ (abc:165)
----------------] ABCMeta.__subclasses__ (abc:165)  0.044ms
--------------. __subclasscheck__ (abc:166)
----------------[  (abc:166)
------------------> __subclasscheck__ (abc:134)
------------------. __subclasscheck__ (abc:137)
------------------. __subclasscheck__ (abc:140)
------------------. __subclasscheck__ (abc:144)
------------------. __subclasscheck__ (abc:147)
--------------------[ ABCMeta.__subclasshook__ (abc:147)
--------------------] ABCMeta.__subclasshook__ (abc:147)  0.045ms
------------------. __subclasscheck__ (abc:148)
------------------. __subclasscheck__ (abc:156)
--------------------[  (abc:156)
--------------------]  (abc:156)  0.043ms
------------------. __subclasscheck__ (abc:160)
------------------. __subclasscheck__ (abc:165)
--------------------[ ABCMeta.__subclasses__ (abc:165)
--------------------] ABCMeta.__subclasses__ (abc:165)  0.043ms
------------------. __subclasscheck__ (abc:170)
--------------------[ set.add (abc:170)
--------------------] set.add (abc:170)  0.043ms
------------------. __subclasscheck__ (abc:171)
------------------< __subclasscheck__ (abc:171): False 1.624ms
----------------]  (abc:166)  1.867ms
--------------. __subclasscheck__ (abc:165)
--------------. __subclasscheck__ (abc:170)
----------------[ set.add (abc:170)
----------------] set.add (abc:170)  0.041ms
--------------. __subclasscheck__ (abc:171)
--------------< __subclasscheck__ (abc:171): False 3.866ms
------------]  (abc:166)  4.063ms
----------. __subclasscheck__ (abc:165)
----------. __subclasscheck__ (abc:170)
------------[ set.add (abc:170)
------------] set.add (abc:170)  0.043ms
----------. __subclasscheck__ (abc:171)
----------< __subclasscheck__ (abc:171): False 5.968ms
--------]  (abc:166)  6.159ms
------. __subclasscheck__ (abc:165)
------. __subclasscheck__ (abc:170)
--------[ set.add (abc:170)
--------] set.add (abc:170)  0.042ms
------. __subclasscheck__ (abc:171)
------< __subclasscheck__ (abc:171): False 31.110ms
----< __instancecheck__ (abc:130): False 32.160ms
--]  (_cprequest:791)  32.350ms

5 comments

Comment from: Nick Coghlan [Visitor]

I'm guessing "value" is an instance of a class with a fairly long inheritance tree?

It would be worth comparing the first check for an instance of that type with a subsequent check - there is a reason ABCs cache results instead of looking them up anew every time.

02/24/11 @ 19:49
Comment from: Tom [Visitor]

Hey, how did you do those call/time graphs? They are rather nice.

02/25/11 @ 06:08
Comment from: fumanchu [Member] Email

Hi Tom,

I used PyConquer, which is even nicer than you see above ;) -- it puts the output of each thread in its own swimlane. Get it at http://www.aminus.net/wiki/PyConquer

02/25/11 @ 09:18
Comment from: Brandon Craig Rhodes [Visitor] Email · http://rhodesmill.org/brandon

I am still dismayed that they went forward with this awful ABC concept. They have overloaded "isinstance()", which ought properly to mean "is this object implemented atop class X" — and which, therefore, ought properly to never be called in Python code — so that it now also tries to mean "is this object willing to exhibit set-of-behaviors Y", which means that each object now has to have both an implementation hierarchy and a contract/interface hierarchy all munged together into a single big awkward tree. Whereas, in fact, the Pythonic approach — analogous to duck typing — would have been a clean and separate interface hierarchy, where the fact of whether an object provides behavior Y is fully separate from the question of being an instance of X.

02/28/11 @ 08:02
Comment from: andrew cooke [Visitor] · http://www.acooke.org

isn't this cached? so it will be called only once for any particular check. so it's probably not as bad as you think.

[also, it has taken me two attempts so far to prove i am a real human...]

04/20/11 @ 06:36

Leave a comment


Your email address will not be revealed on this site.

Your URL will be displayed.

Please enter the phrase "I am a real human." in the textbox above.
(Line breaks become <br />)
(Name, email & website)
(Allow users to contact you through a message form (your email will not be revealed.)
October 2014
Sun Mon Tue Wed Thu Fri Sat
 << <   > >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

Search

The requested Blog doesn't exist any more!

XML Feeds

powered by b2evolution free blog software