Pillow
Pillow copied to clipboard
Optimize getbbox() and getextrema() routines
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
face1.png test image
Could you provide a copy of face1.png?
@radarhere Ok, added, but it's just some random image from stocks)
Rebased