Optimize getbbox() and getextrema() routines by homm · Pull Request #8194 · python-pillow/Pillow
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

