Speedup Bitmap Parser

bearophileHUGS at lycos.com bearophileHUGS at lycos.com
Tue Feb 17 13:35:40 EST 2009


Jayson Santos:
> And here is the final code:http://pastebin.com/f3e20d669

Note that if you use Psyco this lookup trick isn't useful, but if the
Psyco isn't available it can improve performance a little:
append = BitmapList['lines'].append


I suggest to replace this code:

        red, green, blue = struct.unpack('BBB', s[i:i+3])
        append({
            'red': red,
            'green': green,
            'blue': blue,
        })

With something just like:

        rbg = struct.unpack('BBB', s[i:i+3])

Later you can access r g and b by their position, avoiding the
allocation and creation of a new dict for each pixel.
(array.array too is able to do that, but using unpack is probably fine
too. Using an array.array you can probably decode many rbg triples in
a single time, and slice it later, this looks faster).


In the following code:

if __name__ == '__main__':
    ...
        ...
        for line in BitmapList['lines']:
            for x, color in enumerate(line):
                ...

note that Psyco is able to compile code only if it's inside functions
or methods, so it may give a bit of improvement if you move such loops
into a function.
I don't know if Psyco is already able to compile enumerate(), if not,
then replacing the enumerate with a manual counter speeds up the code.

I think ShedSkin doesn't have the struct module yet, once someone has
written such standard module, you can probably produce a compiled (C+
+) module with your code that 10-50 times faster than the original
Python code, with no changes in the Python code itself :-)

Bye,
bearophile



More information about the Python-list mailing list