# Optimisation problem - in C?

Sebastian Dauss sebastian.dauss at web.de
Wed Feb 21 15:11:24 CET 2001

```> It's too bad that lists don't have a .get() method (so x.get(3) would be
> equal to x[3]), because resultvector=map(sourcelist.get, elementlist)
> would be fastest (all done in C).

Oh, in fact there is a list get()-method. It is hidden within the
'operator'-module ;). The only disadvantage is that it expects the sequence
to fetch the item from in its first argument, so you have to make a list of
references to the sourcelist in order to apply the map()-function. If memory
consumption is not an issue, you can try to do the most work at C-speed by
using:

import operator
def makevector_operator(sourcelist,elementlist):
return map(operator.getitem, [sourcelist]*len(elementlist),
elementlist)

Let's summarize and profile the different approaches (300000 items in
sourcelist, 70000 in elementlist with random indices):

Runtime UsrTim SysTim Count  TimerName
0.517912   0.50   0.01     1: makevector
0.361448   0.33   0.01     1: makevector_listc
0.222591   0.22   0.00     1: makevector_noappend
0.221596   0.22   0.00     1: makevector_lambda
0.183666   0.19   0.00     1: makevector_operator

def makevector(sourcelist,elementlist):
resultvector = []
for element in elementlist:
resultvector.append(sourcelist[element])
return resultvector

def makevector_noappend(sourcelist, elementlist):
resultvector = elementlist[:]
for i in range(len(elementlist)):
resultvector[i] = sourcelist[elementlist[i]]
return resultvector

def makevector_lambda(sourcelist,elementlist):
return map(lambda i, l=sourcelist: l[i], elementlist)

def makevector_listc(sourcelist,elementlist):
return [sourcelist[element] for element in elementlist]

def makevector_operator(sourcelist,elementlist):
return map(operator.getitem, [sourcelist]*len(elementlist), elementlist)

Of course, now I'm very interested in the performance of a C-implementation
;).
Maybe it would help to have something like a "constant sequence" in C to
avoid generating the reference-list. Then, you could write:

listreferences = xReferenceList(sourcelist, len(elementlist))
return map(operator.getitem, listreferences, elementlist)

Greetings,
Sebastian.

```

More information about the Python-list mailing list