Oliver Eichler wrote: > what will be the fastest solution to following problem > > class a: > def __init__(self): > self.varA = 0 > self.varB = 0 > s.o. ... > > > listA = [a]*10 > > > varA = [] > varB = [] > > for l in listA: > varA.append(l.varA) > varB.append(l.varB) > s.o. ... > > > I could think of: > [varA.append(l.varA) for l in listA] > [varB.append(l.varB) for l in listA] > s.o. ... > > But is this faster? After all I have to iterate over listA several times. > > Any better solutions?
A different approach, a "virtual list" could even be faster if client code must access only a fraction of the items in the virtual list. If you are lucky, you never have to iterate over the complete list. >>> class A: ... def __init__(self, a): ... self.a = a ... def __repr__(self): ... return "A(%r)" % self.a ... >>> items = map(A, range(10)) >>> items [A(0), A(1), A(2), A(3), A(4), A(5), A(6), A(7), A(8), A(9)] >>> class List: ... def __init__(self, items, getter): ... self.items = items ... self.getter = getter ... def __getitem__(self, index): ... return self.getter(self.items[index]) ... def __iter__(self): ... return imap(self.getter, self.items) ... >>> from operator import attrgetter >>> from itertools import imap >>> items_a = List(items, attrgetter("a")) >>> items_a <__main__.List instance at 0x402ae2cc> >>> items_a[2] 2 >>> list(items_a) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> items[2] = A(42) >>> items [A(0), A(1), A(42), A(3), A(4), A(5), A(6), A(7), A(8), A(9)] >>> items_a[2] 42 Peter -- http://mail.python.org/mailman/listinfo/python-list