由于您没有提供样本图像,我制作了一个大小为1.1MB,尺寸为2544x4200的虚拟文件,并在答案末尾提供。我复制了该图像1000次,并处理了每个基准测试的1000个图像。
由于您只在评论区提供了代码,所以我对其进行了格式化并尽可能地优化了它。我还将其放入循环中,以便可以在Python解释器的一次调用中处理多个文件-当您有20000个文件时,这变得非常重要。
效果如下:
import sys
from PIL import Image
for filename in sys.argv[1:]:
print(f'Processing: {filename}')
imgc = Image.open(filename).crop((0, 150, 270, 1050))
我怀疑我可以使用以下方法使其更快:
这是您代码的pyvips
版本:
import sys
import pyvips
import numpy as np
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()
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
顺序pyvips
./vipsversion bc*
30 seconds, i.e. 7x as fast as PIL which was 224 seconds
并行 pyvips
parallel ./vipsversion ::: bc*
32 seconds
尽可能传递多个文件名的并行pyvips
parallel -X ./vipsversion ::: bc*
5.2 seconds, i.e. this is the way to go :-)
请注意,您可以使用homebrew在macOS上安装GNU Parallel:
brew install parallel