pyqt  

Re: [PyQt] Efficiency under nested loop

Russell Valentine
Thu, 24 Apr 2008 12:08:45 -0700

Sergi Blanch i Torné wrote:
Hi,

In the discussion about the QListWidget[1] I saw something that happens to me also with the QImage conversion from 12 bits to 8. Remember that I have a problem showing grayscaled images[2] I need to say that the data needs to be process and it means the solution cannot be simply acquire the pictures in 8 bits.

Right now I write a loop for the list and then convert to the array of unsigned chars need by the QImage. It means touch each element two times. The


I recommend using numpy. I think you will find it useful for more things than just this as well.
http://numpy.scipy.org/


convertfrom is your original method
convertfrom2 is slightly speed up without numpy
convertfrom3 is with numpy

TIME: convertfrom  - 2.18s
TIME: convertfrom2 - 1.98s
TIME: convertfrom3 - 0.06s


I changed the lshifts to rshifts, because I'm on little endian.


import random
import array
import time

def convertfrom(image):
    bar,barfoo = image,[]
    for i in range(len(bar)):
        barfoo.append(bar[i].__rshift__(8))
    return array.array('B',barfoo).tostring()

def convertfrom2(image):
    barfoo = []
    for i in xrange(len(image)):
        barfoo.append(image[i].__rshift__(8))
    return array.array('B',barfoo).tostring()

im=array.array('H');
for i in xrange(1200*1024):
    im.append(int(random.random()*2**16));

startTime = time.time()
im2=convertfrom(im)
print "TIME: convertfrom - "+str(time.time() - startTime)+"s"

startTime = time.time()
im2=convertfrom2(im)
print "TIME: convertfrom2 - "+str(time.time() - startTime)+"s"


import numpy

def convertfrom3(image):
    return image.__rshift__(8).astype(numpy.uint8).tostring()

im=numpy.array(im)
startTime = time.time()
im2=convertfrom3(im)
print "TIME: convertfrom3 - "+str(time.time() - startTime)+"s"
_______________________________________________
PyQt mailing list    PyQt@riverbankcomputing.com
http://www.riverbankcomputing.com/mailman/listinfo/pyqt