1.衡量代码的性能
2.提高代码性能的细节
3.学习函数cv.getTickCount,cv.getTickFrequency
1、用OpenCV衡量性能
cv.getTickCount函数返回针对参考事件调用函数时的时钟周期数。 所以如果你在函数执行前后调用它,你会得到用于执行函数的时钟周期数。
cv.getTickFrequency函数返回时钟周期的频率或每秒钟的时钟周期数。
import cv2 as cv
import numpy as np
#计算代码的执行时间
e1 = cv.getTickCount()
# your code execution
e2 = cv.getTickCount()
time = (e2 - e1)/ cv.getTickFrequency()
img1 = cv.imread('./images/wolf.jpg')
e1 = cv.getTickCount()
for i in range(5,49,2):
img1 = cv.medianBlur(img1,i)
e2 = cv.getTickCount()
t = (e2 - e1)/cv.getTickFrequency()
print( t )
# Result I got is 0.521107655 seconds
1.947188311738297
2、OpenCV中的默认优化
很多OpenCV功能都使用SSE2,AVX等对代码进行优化。编译时默认启用。可以使用cv.useOptimized()检查是否启用/禁用,使用cv.setUseOptimized()启用/禁用
cv.useOptimized()
False
%timeit res = cv.medianBlur(img1,49)
90.3 ms ± 426 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
cv.setUseOptimized(True)
cv.useOptimized()
True
%timeit res = cv.medianBlur(img1,49)
91 ms ± 100 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
3、在IPython中衡量性能
x = 5
%timeit y=x**2
305 ns ± 3.03 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit y=x*x
42.3 ns ± 0.272 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
z = np.array([5])
print(z)
[5]
%timeit y=z*z
392 ns ± 5.95 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit y=np.square(z)
451 ns ± 0.907 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
4、优化技术
1.尽可能避免在Python中使用循环,特别是双/三循环等。它们本质上很慢。
2.因为Numpy和OpenCV针对向量操作进行了优化,所以可以尽可能地向最大程度地矢量化算法/代码。
利用缓存一致性。
3.除非需要,否则不要复制阵列的副本。 尝试使用视图。 阵列复制是一项代价高昂的操作。
4.即使在完成所有这些操作之后,如果代码仍然很慢,或者使用大循环是不可避免的,请使用Cython等其他库来加快速度。