How can I speed this function up?

Gabriel Genellina gagsl-py at yahoo.com.ar
Sat Nov 18 00:23:40 EST 2006


At Friday 17/11/2006 23:40, Chris wrote:

>This is just some dummy code to mimic what's being done in the real
>code. The actual code is python which is used as a scripting language in
>a third party app. The data structure returned by the app is more or
>less like the "data" list in the code below. The test for "ELEMENT" is
>necessary ... it just evaluates to true every time in this test code. In
>the real app perhaps 90% of tests will also be true.
>
>So my question is how can I speed up what's happening inside the
>function write_data()? Only allowed to use vanilla python (no psycho or
>other libraries outside of a vanilla python install).
>
>I have a vested interest in showing a colleague that a python app can
>yield results in a time comparable to his C-app, which he feels is mch
>faster. I'd like to know what I can do within the constraints of the
>python language to get the best speed possible. Hope someone can help.

If you can assume that all items have 6 numbers, it appears best to 
unroll the inner iteration. Below is my best attempt with ideas from 
other replies too, including some alternatives. The timing is only 
approximate and had a wide dispersion; median of three. But it's 
clear that the main gain comes from calling out.write only once:

Notice that you can't, in general, use i[0] is 'ELEMENT' unless you 
can guarantee that i[0] is an interned string (and if it comes from 
another process, chances are it isn't). Using intern(i[0]) is 
'ELEMENT' would work, but slows down your program.

# initial: 11.66s
def write_data1(out, data):
      write = out.write
      for i in data:
          if i[0] == 'ELEMENT': # sorry but can't guarantee identity

# 6.21s
              write("ELEMENT %06d %s\n" % (i[1], "%d %d %d %d %d %d " % i[2]))

# 6.92s
#             write("ELEMENT %06d %s \n" % (i[1], " ".join(map(str,i[2]))))

# 8.30s [i]
#             i2 = i[2]
#             write("ELEMENT %06d %d %d %d %d %d %d \n" % (i[1], 
i2[0], i2[1], i2[2], i2[3], i2[4], i2[5]))

# 7.04s __getitem__
#            i2 = i[2].__getitem__
#            write("ELEMENT %06d %d %d %d %d %d %d \n" % (i[1], 
i2(0), i2(1), i2(2), i2(3), i2(4), i2(5)))



-- 
Gabriel Genellina
Softlab SRL 

__________________________________________________
Correo Yahoo!
Espacio para todos tus mensajes, antivirus y antispam ¡gratis! 
¡Abrí tu cuenta ya! - http://correo.yahoo.com.ar



More information about the Python-list mailing list