--- 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

Reply via email to