Я часто пишу на питоне экстракторы розничных графический форматов игр. Но вот скорость выполнения зачастую очень низкая. В результате выполнения мне нужно получать объект PIL.Image.
Вот пример.
def decode_image(f): def color(p): r = ((p >> 11) & 31) << 3 g = ((p >> 5) & 63) << 2 b = (p & 31) << 3 return (r,g,b) rgb = [] w,h = struct.unpack("HH", f.read(4)) for i in range(w*h): p = color(struct.unpack("H", f.read(2))[0]) rgb.extend(p) rgb = np.array(rgb, np.uint8).reshape(h, w, 3) image = Image.fromarray(rgb, "RGB") # Готовое изображение
Я пробовал использовать вместо списка rgb стандартную библиотеку array, а также numpy, но скорости это не прибавило. Более того, стандартный список работает быстрее этих библиотек.
Сейчас для ускорения я использую Cython, он существенно увеличивает скорость обработки данных. Слышал про библиотеку ctypes, но точного предназначения её так и не понял. Может быть, с помощью неё можно как-то ускорить процесс?
В общем, как можно максимально ускорить работу стандартными методами?
