--- Rob Williscroft <[EMAIL PROTECTED]> wrote:
> class MyClass(object):
> @init_self
> def __init__( self, x, _y, z ):
> print "in __init__() _y =", _y
Here are the timings (script attached):
overhead: 0.01
plain_grouping: 0.26
update_grouping: 0.45
plain_adopt_grouping: 0.69
autoinit_grouping: 1.14
autoinit_setattr_grouping: 1.07
autoattr_grouping: 1.01
decorated_init_grouping: 0.94
I think your decorator solution looks nice and has a good potential time-wise.
Cheers,
Ralf
____________________________________________________
Sell on Yahoo! Auctions no fees. Bid on great items.
http://auctions.yahoo.com/
import sys, os
class plain_grouping:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
class update_grouping:
def __init__(self, x, y, z):
self.__dict__.update(locals())
del self.self
def plain_adopt():
frame = sys._getframe(1)
init_locals = frame.f_locals
self = init_locals[frame.f_code.co_varnames[0]]
self.__dict__.update(init_locals)
del self.self
class plain_adopt_grouping:
def __init__(self, x, y, z):
plain_adopt()
class autoinit(object):
def __init__(self, *args, **keyword_args):
self.__dict__.update(
zip(self.__autoinit__.im_func.func_code.co_varnames[1:], args))
self.__dict__.update(keyword_args)
self.__autoinit__(*args, **keyword_args)
class autoinit_grouping(autoinit):
def __autoinit__(self, x, y, z):
pass
class autoinit_setattr(object):
def __init__(self, *args, **keyword_args):
for name, value in zip(self.__autoinit__.im_func.func_code.
co_varnames[1:], args):
setattr(self, name, value)
for name, value in keyword_args.items():
setattr(self, name, value)
self.__autoinit__(*args, **keyword_args)
class autoinit_setattr_grouping(autoinit_setattr):
def __autoinit__(self, x, y, z):
pass
class autoattr(type):
def __init__(cls, name, bases, dct):
super(autoattr, cls).__init__(name, bases, dct)
old_init = cls.__init__
varnames = old_init.im_func.func_code.co_varnames[1:]
def new_init(self, *args, **keyword_args):
self.__dict__.update(zip(varnames, args))
self.__dict__.update(keyword_args)
old_init(self, *args, **keyword_args)
cls.__init__ = new_init
class autoattr_grouping:
__metaclass__ = autoattr
def __init__(self, x, y, z):
pass
def init_self( init ):
class KeywordArgumentError(Exception):
pass
vn = init.func_code.co_varnames[ 1 : init.func_code.co_argcount ]
def decorated_init(self, *args, **kw):
off = 0
for name in vn:
if not name.startswith('_'):
if name in kw:
value = kw[name]
else:
value = args[off]
off += 1
setattr( self, name, value )
else:
off += 1
if name in kw:
raise KeywordArgumentError(
"Use %s not %s" % (name[1:],name)
)
if name[1:] in kw:
kw[name] = kw[name[1:]]
del kw[name[1:]]
init( self, *args, **kw )
return decorated_init
class decorated_init_grouping(object):
@init_self
def __init__(self, x, y, z):
pass
try:
from namespace import Record
except ImportError:
Record = None
else:
class record_grouping(Record):
x = None
y = None
z = None
class timer:
def __init__(self):
self.t0 = os.times()
def get(self):
tn = os.times()
return (tn[0]+tn[1]-self.t0[0]-self.t0[1])
def time_overhead(n_repeats):
t = timer()
for i in xrange(n_repeats):
pass
return t.get()
def time(method, n_repeats):
g = method(x=1,y=2,z=3)
assert g.x == 1
assert g.y == 2
assert g.z == 3
t = timer()
for i in xrange(n_repeats):
method(x=1,y=2,z=3)
return t.get()
def time_all(n_repeats=100000):
print "overhead: %.2f" % time_overhead(n_repeats)
print "plain_grouping: %.2f" % time(plain_grouping, n_repeats)
print "update_grouping: %.2f" % time(update_grouping, n_repeats)
print "plain_adopt_grouping: %.2f" % time(plain_adopt_grouping, n_repeats)
print "autoinit_grouping: %.2f" % time(autoinit_grouping, n_repeats)
print "autoinit_setattr_grouping: %.2f" % time(autoinit_setattr_grouping,
n_repeats)
print "autoattr_grouping: %.2f" % time(autoattr_grouping, n_repeats)
print "decorated_init_grouping: %.2f" % time(decorated_init_grouping,
n_repeats)
if (Record is not None):
print "record_grouping: %.2f" % time(record_grouping, n_repeats)
if (__name__ == "__main__"):
time_all()
--
http://mail.python.org/mailman/listinfo/python-list