numpy保存为图片方法及速度对比
最近遇到一个问题,有大量小图片需要保存,分析了一下代码,发现写入图片这个操作很耗时。于是想对比几种存储方法的性能。
参赛选手有:opencv、matplotlib、PIL、imageio
import numpy as np
import cv2
import matplotlib.pyplot as plt
from PIL import Image
import imageio
from line_profiler import LineProfiler
def saveimg(img):
for i in range(100):
#CV2
cv2.imwrite('datatest/' + str(i) + '_cv2.jpg', img)
#matplotlib
plt.imsave('datatest/' + str(i) + '_matplotlib.jpg', img)
#PIL
im = Image.fromarray(img)
im.save('datatest/' + str(i) + '_PIL.jpg')
#imageio
imageio.imsave('datatest/' + str(i) + '_imageio.jpg', img)
if __name__ == '__main__':
img = np.random.randint(0, 255, size = [100,100,3], dtype ='uint8' )
lp = LineProfiler()
lp_wrapper = lp(saveimg)
lp_wrapper(img)
lp.print_stats()
# saveimg(img)
输入结果看:
Line # Hits Time Per Hit % Time Line Contents
==============================================================
8 def saveimg(img):
9 101 1756.0 17.4 0.0 for i in range(100):
10 #CV2
11 100 604846.0 6048.5 14.2 cv2.imwrite('datatest/' + str(i) + '_cv2.jpg', img)
12 #matplotlib
13 100 1426342.0 14263.4 33.4 plt.imsave('datatest/' + str(i) + '_matplotlib.jpg', img)
14 #PIL
15 100 70824.0 708.2 1.7 im = Image.fromarray(img)
16 100 847999.0 8480.0 19.8 im.save('datatest/' + str(i) + '_PIL.jpg')
17 #imageio
18 100 1320907.0 13209.1 30.9 imageio.imsave('datatest/' + str(i) + '_imageio.jpg', img)
opencv最快,14%
其次是PIL,21%
然后是imageio,30%
最慢的是plt,33%
和想象中的结果差不多。