2018년 10월 15일 월요일

Python Image Library(PIL, Pillow)의 성능 테스트

Python Image Library (PIL, python3에서는 pillow)을 이용하여 python에서 image 생성/변경 등이 가능합니다.  그리고, 이 성능 평가를 위해서는 pillow-perf라는 code를 이용할 수 있습니다.   먼저 pillow-perf를 git으로부터 clone 합니다.

[root@python1 ~]# git clone https://github.com/python-pillow/pillow-perf.git

아래와 같이 pip로 필요 package들을 설치합니다.

[root@python1 ~]# cd pillow-perf/testsuite/

[root@python1 testsuite]# pip install -r ./requirements.txt

이제 다음과 같이 몇가지 테스트를 수행해봅니다.   아래의 결과는 Naver nCloud에서 제공되는 E5-2660 v4@2.00GHz에서 수행된 것입니다.  이 테스트는 single-thread로 되어 있고, IBM POWER8/POWER9에서도 동일한 방법으로 수행할 수 있습니다.

[root@python1 testsuite]#  ./run.py scale --progress

Scale 2560×1600 RGB image
    to 26x16 bil        0.01323 s   309.62 Mpx/s
    to 26x16 bic        0.02488 s   164.62 Mpx/s
    to 26x16 lzs        0.03783 s   108.28 Mpx/s
    to 320x200 bil      0.02107 s   194.43 Mpx/s
    to 320x200 bic      0.03579 s   114.45 Mpx/s
    to 320x200 lzs      0.05393 s    75.95 Mpx/s
    to 2048x1280 bil    0.05956 s    68.77 Mpx/s
    to 2048x1280 bic    0.08711 s    47.02 Mpx/s
    to 2048x1280 lzs    0.12037 s    34.03 Mpx/s
    to 5478x3424 bil    0.28072 s    14.59 Mpx/s
    to 5478x3424 bic    0.38422 s    10.66 Mpx/s
    to 5478x3424 lzs    0.49239 s     8.32 Mpx/s

[root@python1 testsuite]# ./run.py scale --mode RGBA

Scale 2560×1600 RGBA image
    to 26x16 bil        0.02508 s   163.33 Mpx/s
    to 26x16 bic        0.04012 s   102.09 Mpx/s
    to 26x16 lzs        0.05564 s    73.62 Mpx/s
    to 320x200 bil      0.03434 s   119.29 Mpx/s
    to 320x200 bic      0.04993 s    82.04 Mpx/s
    to 320x200 lzs      0.07300 s    56.11 Mpx/s
    to 2048x1280 bil    0.10238 s    40.01 Mpx/s
    to 2048x1280 bic    0.13699 s    29.90 Mpx/s
    to 2048x1280 lzs    0.18249 s    22.44 Mpx/s
    to 5478x3424 bil    0.51842 s     7.90 Mpx/s
    to 5478x3424 bic    0.63934 s     6.41 Mpx/s
    to 5478x3424 lzs    0.78471 s     5.22 Mpx/s

[root@python1 testsuite]# ./run.py scale --runs 50

Scale 2560×1600 RGB image
    to 26x16 bil        0.01308 s   313.08 Mpx/s
    to 26x16 bic        0.02493 s   164.28 Mpx/s
    to 26x16 lzs        0.03770 s   108.64 Mpx/s
    to 320x200 bil      0.02115 s   193.62 Mpx/s
    to 320x200 bic      0.03549 s   115.42 Mpx/s
    to 320x200 lzs      0.05399 s    75.87 Mpx/s
    to 2048x1280 bil    0.05944 s    68.91 Mpx/s
    to 2048x1280 bic    0.08735 s    46.89 Mpx/s
    to 2048x1280 lzs    0.12058 s    33.97 Mpx/s
    to 5478x3424 bil    0.28272 s    14.49 Mpx/s
    to 5478x3424 bic    0.38564 s    10.62 Mpx/s
    to 5478x3424 lzs    0.49298 s     8.31 Mpx/s

[root@python1 testsuite]# ./run.py blur

Blur 2560×1600 RGB image
    1px                 0.22742 s    18.01 Mpx/s
    10px                0.22500 s    18.20 Mpx/s
    30px                0.22543 s    18.17 Mpx/s

[root@python1 testsuite]# ./run.py convert

Convert 2560×1600 RGB image
    RGB to L            0.00539 s   760.07 Mpx/s
    RGBA to LA          0.00652 s   627.90 Mpx/s
    RGBa to RGBA        0.03590 s   114.08 Mpx/s
    RGBA to RGBa        0.00851 s   481.57 Mpx/s


그 외에, 실제 jpg 파일들을 이용하여 몇가지 PIL 처리를 하는 sample code를 수행해보는 것도 괜찮습니다.

[root@python1 ~]# cat piljpg.py
from PIL import Image, ImageFilter
list = [ "1.jpg", "2.jpg", "3.jpg", "4.jpg", "5.jpg", "6.jpg", "7.jpg", "8.jpg", "9.jpg", "10.jpg" ]
for x in list:
    im = Image.open(x)
    print(im.size)
    im.save('pasta.jpg')
    im = Image.open(x)
    size = (64, 64)
    im.thumbnail(size)
    im.save('python-thumb.jpg')
    im = Image.open(x)
    cropImage = im.crop((100, 100, 150, 150))
    cropImage.save('python-crop.png')
    im = Image.open(x)
    img2 = im.resize((600, 600))
    img2.save('python-600.jpg')
    img3 = im.rotate(90)
    img3.save('rotate.jpg')
    im = Image.open(x)
    blurImage = im.filter(ImageFilter.BLUR)
    blurImage.save('python-blur.jpg')


[root@python1 ~]# time python piljpg.py
(2281, 3072)
(972, 1422)
(972, 1422)
(972, 1422)
(972, 1422)
(972, 1422)
(5040, 4912)
(1600, 1280)
(2281, 3072)
(972, 1422)

real    0m15.047s
user    0m14.759s
sys     0m0.285s


piljpg.py의 코드와 거기에 쓰인 *.jpg 파일은 아래 구글 드라이브에 올려놓았습니다.

https://drive.google.com/open?id=1LdjcDXrQ3Dps0ertGwGMyMYKRhxo5FEB

댓글 없음:

댓글 쓰기