Optimisation problem - in C?

Sebastian Dauss sebastian.dauss at web.de
Wed Feb 21 09:11:24 EST 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