在做图像处理时,你不仅要保证你的代码是正确的,还要保证运行的速度是否最快,根据Python之禅 There should be one and preferably only one obvious way to do it.你需要检查你的代码。
评估代码时间
import cv2
start = cv2.getTickCount()
# 这里写代码...
end = cv2.getTickCount()
print((end - start) / cv2.getTickFrequency())
这段代码就是用来测量程序运行时间的(单位:s),其中cv2.getTickCount()函数得到电脑启动以来的时钟周期数,cv2.getTickFrequency()返回你电脑的主频,前后相减再除以主频就是你代码的运行时间(这样解释并不完全准确,但能理解就行)。另外,也可以用Python中的time模块计时:
import time
start = time.clock()
# 这里写代码...
end = time.clock()
print(end - start)
OpenCV优化
# 用cv2.useOptimized()检查是否可以优化
In [5]: cv2.useOptimized()
Out[5]: True
In [6]: %timeit res = cv2.medianBlur(img,49)
10 loops, best of 3: 34.9 ms per loop
# 禁止优化
In [7]: cv2.setUseOptimized(False)
In [8]: cv2.useOptimized()
Out[8]: False
In [9]: %timeit res = cv2.medianBlur(img,49)
10 loops, best of 3: 64.1 ms per loop
#可以看到,前后相差一倍运行时间
Python中的性能优化
举例说明
In [10]: x = 5
In [11]: %timeit y=x**2
10000000 loops, best of 3: 73 ns per loop
In [12]: %timeit y=x*x
10000000 loops, best of 3: 58.3 ns per loop
In [15]: z = np.uint8([5])
In [17]: %timeit y=z*z
1000000 loops, best of 3: 1.25 us per loop
In [19]: %timeit y=np.square(z)
1000000 loops, best of 3: 1.16 us per loop
可以看到, x = 5 ; y = x*x是最快的,比Numpy快约20倍。
总结:Python标量操作速度比Numpy标量操作快得多。对于操作一两个元素,使用Python,大数组时用Numpy。
举例说明2
In [35]: %timeit z = cv2.countNonZero(img)
100000 loops, best of 3: 15.8 us per loop
In [36]: %timeit z = np.count_nonzero(img)
1000 loops, best of 3: 370 us per loop
可以看到, OpenCV函数比Numpy几乎快25倍
总结:通常,OpenCV函数比Numpy功能。对于同一操作,优先选用OpenCV。
性能优化技巧
- 在Python中尽量避免使用循环、尤其是多重循环,机器耗费时间;
- 将算法/代码尽可能的向量话,因为Numpy和OpenCV对此进行了优化;
- 利用缓存一致性;
- 不要做数组的复制,这极其耗费资源。