| « There's got to be a name for this | logging.statistics » |
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
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.
Hey, how did you do those call/time graphs? They are rather nice.
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
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.
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...]