Whilst considering a port of old code to python 3 I see that in several places we are using type comparisons to control processing of user instances (as opposed to instances of built in types eg float, int, str)

I find that the obvious alternatives are not as fast as the current code; func0 below. On my machine isinstance seems slower than type for some reason. My 2.6 timings are

C:\Tmp>\Python\lib\timeit.py -s"import t;v=t.X()" t.func0(v)
1000000 loops, best of 3: 0.348 usec per loop

C:\Tmp>\Python\lib\timeit.py -s"import t;v=t.X()" t.func1(v)
1000000 loops, best of 3: 0.747 usec per loop

C:\Tmp>\Python\lib\timeit.py -s"import t;v=t.X()" t.func2(v)
1000000 loops, best of 3: 0.378 usec per loop

C:\Tmp>\Python\lib\timeit.py -s"import t;v=t.X()" t.func3(v)
1000000 loops, best of 3: 0.33 usec per loop

C:\Tmp>\Python\lib\timeit.py -s"import t;v=t.X()" t.func0(1)
1000000 loops, best of 3: 0.477 usec per loop

C:\Tmp>\Python\lib\timeit.py -s"import t;v=t.X()" t.func1(1)
1000000 loops, best of 3: 1.14 usec per loop

C:\Tmp>\Python\lib\timeit.py -s"import t;v=t.X()" t.func2(1)
1000000 loops, best of 3: 1.16 usec per loop

C:\Tmp>\Python\lib\timeit.py -s"import t;v=t.X()" t.func3(1)
1000000 loops, best of 3: 1.14 usec per loop

so func 3 seems to be the fastest option for the case when the first test matches, but is poor when it doesn't. Can anyone suggest a better way to determine if an object is a user instance?

##############################
from types import InstanceType
class X:
    __X__=True

class V(X):
    pass

def func0(ob):
    t=type(ob)
    if t is InstanceType:
        pass
    elif t in (float, int):
        pass
    else:
        pass

def func1(ob):
    if isinstance(ob,X):
        pass
    elif type(ob) in (float, int):
        pass
    else:
        pass

def func2(ob):
    if getattr(ob,'__X__',False):
        pass
    elif type(ob) in (float, int):
        pass
    else:
        pass

def func3(ob):
    if hasattr(ob,'__X__'):
        pass
    elif type(ob) in (float, int):
        pass
    else:
        pass
##############################

--
Robin Becker
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to