--- Scott David Daniels <[EMAIL PROTECTED]> wrote:
> Should be:
>      class autoinit(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)

Thanks!
I didn't do it like this out of fear it may be too slow. But it turns out to be
faster:

  overhead: 0.00
  plain_grouping: 0.27
  update_grouping: 0.43
  plain_adopt_grouping: 0.68
  autoinit_grouping: 1.15
  autoinit_setattr_grouping: 1.08 # yours
  autoattr_grouping: 1.06

I am amazed. Very good!

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

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