То, чего вы хотите достичь здесь, - это иметь более высокую степень параллелизма. Первое, что нужно сделать, это понять, какова минимальная задача, которую вам нужно здесь выполнить, и исходя из этого, подумать, как лучше ее распределить. .
Первое, на что следует обратить внимание, это то, что существует два поведения: первое, если у вас есть offset_type 0, и другое, если у вас есть offset_type 1, разделите его на две разные функции.
Второеis: для данного изображения вы берете культуры определенного размера с заданным смещением (x, y) для всего изображения. Вы можете, например, упростить эту функцию, чтобы взять одну обрезку изображения, учитывая смещение изображения (x, y). Затем вы можете вызвать эту функцию для всех x и y изображения параллельно. Это в значительной степени то, чего стремится достичь большинство сред обработки изображений, даже больше того, что выполняет код внутри графического процессора, небольшие блоки кода, которые работают локально в изображении.
Итак, допустим, ваше изображение имеет ширину = 100, высота = 100, и вы пытаетесь сделать урожай w = 10, h = 10. Учитывая упрощенную функцию, которую я описал, я назову ее crop(img, x, y, crop_size_x, crop_size_y)
Все, что вам нужно сделать, это создать образ:
img = Image.open(source)
crop_size_x = 10
crop_size_y = 10
crops = [crop(img, x, y, crop_size_x, crop_size_y) for x, y in zip(range(img.width), range(img.height))]
, затем вы можете заменить понимание списка для библиотеки multi_processing, которая можетфактически порождает много процессов, выполняет настоящий параллелизм или даже пишет такой код в ядре / шейдере GPU и использует параллелизм GPU для достижения высокой производительности.