Pillow icon indicating copy to clipboard operation
Pillow copied to clipboard

Optimize getbbox() and getextrema() routines

Open homm opened this issue 1 year ago • 3 comments

Code for ipython:

from PIL import Image
im = Image.new('L', (2048, 2048), 0)
print('Worst case:', im.getbbox())
%timeit im.getbbox()
im = Image.open('tests/images/face1.png').resize((2048, 2048))
print('Normal case:', im.getbbox())
%timeit im.getbbox()
im = Image.open('tests/images/dices.png').resize((2048, 2048))
print('Normal case:', im.getbbox())
%timeit im.getbbox()
im = im.convert('RGB').convert('RGBA')
print('Best case:', im.getbbox())
%timeit im.getbbox()
im = im.convert('L')
print('Extrema:', im.getextrema())
%timeit im.getextrema()

main branch

Worst case: None
2.31 ms ± 3.29 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Normal case: (150, 474, 1802, 2048)
3.97 ms ± 519 ns per loop (mean ± std. dev. of 7 runs, 100 loops each)
Normal case: (286, 70, 1724, 1797)
3.86 ms ± 461 ns per loop (mean ± std. dev. of 7 runs, 100 loops each)
Best case: (0, 0, 2048, 2048)
4.6 ms ± 464 ns per loop (mean ± std. dev. of 7 runs, 100 loops each)
Extrema: (0, 255)
2.3 ms ± 468 ns per loop (mean ± std. dev. of 7 runs, 100 loops each)

optimize-getbbox branch

Worst case: None
1.16 ms ± 1.65 μs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
Normal case: (150, 474, 1802, 2048)
722 μs ± 161 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
Normal case: (286, 70, 1724, 1797)
874 μs ± 260 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
Best case: (0, 0, 2048, 2048)
2.51 μs ± 18.1 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)
Extrema: (0, 255)
97.6 μs ± 5.74 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
Worst case: 1.99x speedup
Normal case: 5.5x speedup
Normal case: 4.4x speedup
Best case: 1833x speedup
Extrema: 23.5x speedup

dices.png test image

dices

face1.png test image

face1

homm avatar Jul 02 '24 14:07 homm

Could you provide a copy of face1.png?

radarhere avatar Aug 14 '24 07:08 radarhere

@radarhere Ok, added, but it's just some random image from stocks)

homm avatar Aug 14 '24 08:08 homm

Rebased

homm avatar Aug 14 '24 11:08 homm