Поскольку вы не предоставили образец изображения, я создал фиктивный файл с размерами 2544x4200 и размером 1,1 МБ, который указан в конце ответа.Я сделал 1000 копий этого изображения и обработал все 1000 изображений для каждого теста.
Поскольку вы указали свой код только в области комментариев, я взял его, отформатировал и сделал все, что мог.Я также поместил его в цикл, чтобы он мог обрабатывать множество файлов за один вызов интерпретатора Python - это становится важным, когда у вас есть 20 000 файлов.
Это выглядит так:
#!/usr/bin/env python3
import sys
from PIL import Image
# Process all input files so we only incur Python startup overhead once
for filename in sys.argv[1:]:
print(f'Processing: {filename}')
imgc = Image.open(filename).crop((0, 150, 270, 1050))
Я подозреваю, что я могу сделать это быстрее, используя:
- GNU Parallel и / или
- pyvips
Вот версия pyvips
вашего кода:
#!/usr/bin/env python3
import sys
import pyvips
import numpy as np
# Process all input files so we only incur Python startup overhead once
for filename in sys.argv[1:]:
print(f'Processing: {filename}')
img = pyvips.Image.new_from_file(filename, access='sequential')
roi = img.crop(0, 150, 270, 900)
mem_img = roi.write_to_memory()
# Make a numpy array from that buffer object
nparr = np.ndarray(buffer=mem_img, dtype=np.uint8,
shape=[roi.height, roi.width, roi.bands])
Вот результаты:
Последовательный исходный код
./orig.py bc*jpg
224 seconds, i.e. 224 ms per image, same as you
Параллельный исходный код
parallel ./orig.py ::: bc*jpg
55 seconds
Параллельный оригиналкод, но передавая столько имен файлов, сколько возможно
parallel -X ./orig.py ::: bc*jpg
42 seconds
последовательные пивипы
./vipsversion bc*
30 seconds, i.e. 7x as fast as PIL which was 224 seconds
параллельные пивипы
parallel ./vipsversion ::: bc*
32 seconds
параллельные пивипы, но передавая столько имен файлов, сколько возможно
parallel -X ./vipsversion ::: bc*
5.2 seconds, i.e. this is the way to go :-)
Обратите внимание, что вы можете установить GNU Parallel на macOS с homebrew :
brew install parallel