I’ve got code that takes a PIL image and converts it to a ctypes array to pass out to a C function:
w_px, h_px = img.size
pixels = struct.unpack('%dI'%(w_px*h_px), img.convert('RGBA').tostring())
pixels_array = (ctypes.c_int * len(pixels))(*pixels)
But I’m dealing with big images, and unpacking that many items into function arguments seems to be noticeably slow. What’s the simplest thing I can do to get a reasonable speedup?
I’m only converting to a tuple as an intermediate step, so if it’s unnecessary, all the better.
You can first build an uninitialized array:
and then copy the image’s contents into it:
The return value of memcpy is an address you don’t care about, so I “swallowed” it by assigning it to name “single underscore” (which by convention means “I don’t care about this one”;-).
Edit: as @Mu Mind points out in a comment, the latter fragment can usefully be simplified to use ctypes.memmove without the need to go platform-dependent to ferret out
clib: just do