Neil Toronto added the comment:

I've attached the microbenchmarks I was using for my own version of
attribute caching. For list, tuple, dict, and a deep hierarchy, it tests
accessing type attributes (cls.__class__), class attributes
(cls.__init__), class attributes via instance (inst.__class__), and
instance attributes (inst.__init__), using LOAD_ATTR and hasattr. It
also tests hasattr with missing attributes.

----------
nosy: +ntoronto
Added file: http://bugs.python.org/file8887/fastattr_test.py

_____________________________________
Tracker <[EMAIL PROTECTED]>
<http://bugs.python.org/issue1700288>
_____________________________________
#!/usr/bin/python

import timeit, random, time, sys

MULTIPLIER = 1


class A(object):
	def __init__(self, *args):
		pass

class B(A): pass

class C(B): pass

class D(C): pass

class E(D): pass

class F(E): pass

class G(F): pass

class H(G):
	def __init__(self):
		pass

class I(H): pass


def test_init(tmp):
	tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__
	tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__
	tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__
	tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__
	tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__
	tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__
	tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__
	tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__
	tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__
	tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__
	tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__
	tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__
	tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__
	tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__
	tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__
	tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__
	tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__
	tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__
	tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__
	tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__; tmp.__init__


def test_class(tmp):
	tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__
	tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__
	tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__
	tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__
	tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__
	tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__
	tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__
	tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__
	tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__
	tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__
	tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__
	tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__
	tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__
	tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__
	tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__
	tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__
	tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__
	tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__
	tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__
	tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__; tmp.__class__


def test_has_init(tmp):
	hasattr(tmp, '__init__'); hasattr(tmp, '__init__')
	hasattr(tmp, '__init__'); hasattr(tmp, '__init__')
	hasattr(tmp, '__init__'); hasattr(tmp, '__init__')
	hasattr(tmp, '__init__'); hasattr(tmp, '__init__')
	hasattr(tmp, '__init__'); hasattr(tmp, '__init__')
	hasattr(tmp, '__init__'); hasattr(tmp, '__init__')
	hasattr(tmp, '__init__'); hasattr(tmp, '__init__')
	hasattr(tmp, '__init__'); hasattr(tmp, '__init__')
	hasattr(tmp, '__init__'); hasattr(tmp, '__init__')
	hasattr(tmp, '__init__'); hasattr(tmp, '__init__')
	hasattr(tmp, '__init__'); hasattr(tmp, '__init__')
	hasattr(tmp, '__init__'); hasattr(tmp, '__init__')
	hasattr(tmp, '__init__'); hasattr(tmp, '__init__')
	hasattr(tmp, '__init__'); hasattr(tmp, '__init__')
	hasattr(tmp, '__init__'); hasattr(tmp, '__init__')
	hasattr(tmp, '__init__'); hasattr(tmp, '__init__')
	hasattr(tmp, '__init__'); hasattr(tmp, '__init__')
	hasattr(tmp, '__init__'); hasattr(tmp, '__init__')
	hasattr(tmp, '__init__'); hasattr(tmp, '__init__')
	hasattr(tmp, '__init__'); hasattr(tmp, '__init__')
	hasattr(tmp, '__init__'); hasattr(tmp, '__init__')
	hasattr(tmp, '__init__'); hasattr(tmp, '__init__')
	hasattr(tmp, '__init__'); hasattr(tmp, '__init__')
	hasattr(tmp, '__init__'); hasattr(tmp, '__init__')
	hasattr(tmp, '__init__'); hasattr(tmp, '__init__')


def test_has_class(tmp):
	hasattr(tmp, '__class__'); hasattr(tmp, '__class__')
	hasattr(tmp, '__class__'); hasattr(tmp, '__class__')
	hasattr(tmp, '__class__'); hasattr(tmp, '__class__')
	hasattr(tmp, '__class__'); hasattr(tmp, '__class__')
	hasattr(tmp, '__class__'); hasattr(tmp, '__class__')
	hasattr(tmp, '__class__'); hasattr(tmp, '__class__')
	hasattr(tmp, '__class__'); hasattr(tmp, '__class__')
	hasattr(tmp, '__class__'); hasattr(tmp, '__class__')
	hasattr(tmp, '__class__'); hasattr(tmp, '__class__')
	hasattr(tmp, '__class__'); hasattr(tmp, '__class__')
	hasattr(tmp, '__class__'); hasattr(tmp, '__class__')
	hasattr(tmp, '__class__'); hasattr(tmp, '__class__')
	hasattr(tmp, '__class__'); hasattr(tmp, '__class__')
	hasattr(tmp, '__class__'); hasattr(tmp, '__class__')
	hasattr(tmp, '__class__'); hasattr(tmp, '__class__')
	hasattr(tmp, '__class__'); hasattr(tmp, '__class__')
	hasattr(tmp, '__class__'); hasattr(tmp, '__class__')
	hasattr(tmp, '__class__'); hasattr(tmp, '__class__')
	hasattr(tmp, '__class__'); hasattr(tmp, '__class__')
	hasattr(tmp, '__class__'); hasattr(tmp, '__class__')
	hasattr(tmp, '__class__'); hasattr(tmp, '__class__')
	hasattr(tmp, '__class__'); hasattr(tmp, '__class__')
	hasattr(tmp, '__class__'); hasattr(tmp, '__class__')
	hasattr(tmp, '__class__'); hasattr(tmp, '__class__')
	hasattr(tmp, '__class__'); hasattr(tmp, '__class__')


def test_has_intit(tmp):
	hasattr(tmp, '__intit__'); hasattr(tmp, '__intit__')
	hasattr(tmp, '__intit__'); hasattr(tmp, '__intit__')
	hasattr(tmp, '__intit__'); hasattr(tmp, '__intit__')
	hasattr(tmp, '__intit__'); hasattr(tmp, '__intit__')
	hasattr(tmp, '__intit__'); hasattr(tmp, '__intit__')
	hasattr(tmp, '__intit__'); hasattr(tmp, '__intit__')
	hasattr(tmp, '__intit__'); hasattr(tmp, '__intit__')
	hasattr(tmp, '__intit__'); hasattr(tmp, '__intit__')
	hasattr(tmp, '__intit__'); hasattr(tmp, '__intit__')
	hasattr(tmp, '__intit__'); hasattr(tmp, '__intit__')


def test_has_klass(tmp):
	hasattr(tmp, '__klass__'); hasattr(tmp, '__klass__')
	hasattr(tmp, '__klass__'); hasattr(tmp, '__klass__')
	hasattr(tmp, '__klass__'); hasattr(tmp, '__klass__')
	hasattr(tmp, '__klass__'); hasattr(tmp, '__klass__')
	hasattr(tmp, '__klass__'); hasattr(tmp, '__klass__')
	hasattr(tmp, '__klass__'); hasattr(tmp, '__klass__')
	hasattr(tmp, '__klass__'); hasattr(tmp, '__klass__')
	hasattr(tmp, '__klass__'); hasattr(tmp, '__klass__')
	hasattr(tmp, '__klass__'); hasattr(tmp, '__klass__')
	hasattr(tmp, '__klass__'); hasattr(tmp, '__klass__')


testclasses = [list, dict, tuple, A, B, C, D, E, F, G, H, I]
list = list
dict = dict
tuple = tuple
list_inst = list()
dict_inst = dict()
tuple_inst = tuple()
A_inst = A()
B_inst = B()
C_inst = C()
D_inst = D()
E_inst = E()
F_inst = F()
G_inst = G()
H_inst = H()
I_inst = I()

if __name__ == '__main__':
	print 'class class.__class__ class.__init__' + \
		' class().__class__ class().__init__'
	for cls in testclasses:
		name = cls.__name__
		print name,
		sys.stdout.flush()
		
		print timeit.Timer('test_class(%s)' % name, 
			'from __main__ import test_class, %s' % name)\
			.timeit(number=100000 * MULTIPLIER),
		sys.stdout.flush()
		
		print timeit.Timer('test_init(%s)' % name,
			'from __main__ import test_init, %s' % name)\
			.timeit(number=100000 * MULTIPLIER),
		sys.stdout.flush()
		
		print timeit.Timer('test_class(%s_inst)' % name,
			'from __main__ import test_class, %s_inst' % name)\
			.timeit(number=100000 * MULTIPLIER),
		sys.stdout.flush()
	
		print timeit.Timer('test_init(%s_inst)' % name,
			'from __main__ import test_init, %s_inst' % name)\
			.timeit(number=100000 * MULTIPLIER),
		sys.stdout.flush()
		
		print
	print
	
	print 'class hasattr(class,"__class__") hasattr(class,"__init__")' + \
		' hasattr(class(),"__class__") hasattr(class(),"__init__")'
	for cls in testclasses:
		name = cls.__name__
		print name,
		sys.stdout.flush()
		
		print timeit.Timer('test_has_class(%s)' % name,
			'from __main__ import test_has_class, %s' % name)\
			.timeit(number=100000 * MULTIPLIER),
		sys.stdout.flush()
		
		print timeit.Timer('test_has_init(%s)' % name,
			'from __main__ import test_has_init, %s' % name)\
			.timeit(number=100000 * MULTIPLIER),
		sys.stdout.flush()
		
		print timeit.Timer('test_has_class(%s_inst)' % name,
			'from __main__ import test_has_class, %s_inst' % name)\
			.timeit(number=100000 * MULTIPLIER),
		sys.stdout.flush()
	
		print timeit.Timer('test_has_init(%s_inst)' % name,
			'from __main__ import test_has_init, %s_inst' % name)\
			.timeit(number=100000 * MULTIPLIER),
		sys.stdout.flush()
		
		print
	print

	print 'class hasattr(class,"__klass__") hasattr(class,"__intit__")' + \
		' hasattr(class(),"__klass__") hasattr(class(),"__intit__")'
	for cls in testclasses:
		name = cls.__name__
		print name,
		sys.stdout.flush()
		
		print timeit.Timer('test_has_klass(%s)' % name,
			'from __main__ import test_has_klass, %s' % name)\
			.timeit(number=100000 * MULTIPLIER),
		sys.stdout.flush()
		
		print timeit.Timer('test_has_intit(%s)' % name,
			'from __main__ import test_has_intit, %s' % name)\
			.timeit(number=100000 * MULTIPLIER),
		sys.stdout.flush()
		
		print timeit.Timer('test_has_klass(%s_inst)' % name,
			'from __main__ import test_has_klass, %s_inst' % name)\
			.timeit(number=100000 * MULTIPLIER),
		sys.stdout.flush()
	
		print timeit.Timer('test_has_intit(%s_inst)' % name,
			'from __main__ import test_has_intit, %s_inst' % name)\
			.timeit(number=100000 * MULTIPLIER),
		sys.stdout.flush()
		
		print
	print
_______________________________________________
Python-bugs-list mailing list 
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to