目录
1 使用OpenCV检测程序效率 2 OpenCV中的默认优化 3 在Ipython中检测效率 4 效率优化技术
1 使用OpenCV检测程序效率
cv2.getTickCount()
函数返回从参考点到这个函数被执行的时钟数。
cv2.getTickFrequency()
返回时钟频率,或者说每秒钟的时钟数。
举个例子:
import cv2
import numpy as np
import time
# 使用cv2.getTickCount()计时
img1 = cv2.imread('logo.jpg')
t1 = cv2.getTickCount()
for i in range(5, 49, 2):
img1 = cv2.medianBlur(img1, i)
t2 = cv2.getTickCount()
t = (t2 - t1)/cv2.getTickFrequency()
print('Result I got is ', t, ' seconds')
# 使用time.clock()计时
img2 = cv2.imread('logo.jpg')
start = time.clock()
for i in range(5, 49, 2):
img2 = cv2.medianBlur(img2, i)
elapsed = (time.clock() - start)
print('Result I got is ', elapsed, ' seconds')
结果如下:
2 OpenCV中的默认优化
OpenCV 中的很多函数都被优化过(使用 SSE2,AVX 等)。也包含一些 没有被优化的代码。如果我们的系统支持优化的话要尽量利用只一点。在编译时 优化是被默认开启的。因此 OpenCV 运行的就是优化后的代码,如果你把优化 关闭的话就只能执行低效的代码了。
cv2.useOptimized()
查看优化是否被开启了
cv2.setUseOptimized()
用于开启或关闭优化
举一个例子
额。。。,好像并没有优化,目前不知道为什么。
3 在Ipython中检测效率
在Ipython中可以使用%time命令让代码运行好几次从而得到一个准确的(运行)时间。它也可以被用来测试单行代码。
例如:
可以看出Python 的标量计算比 Nump 的标量计算要快。对于仅包含一两个 元素的操作 Python 标量比 Numpy 的数组要快。但是当数组稍微大一点时 Numpy 就会胜出了。
我们来再看几个例子。我们来比较一下 cv2.countNonZero() 和 np.count_nonzero()。
很明显cv2.countNonZero() 比 np.count_nonzero()快了30多倍。
一般情况下 OpenCV 的函数要比 Numpy 函数快。所以对于相同的操 作最好使用 OpenCV 的函数。当然也有例外,尤其是当使用 Numpy 对视图 (而非复制)进行操作时。
4 效率优化技术
- 尽量避免使用循环,尤其双层三层循环,它们天生就是非常慢的。
- 算法中尽量使用向量操作,因为 Numpy 和 OpenCV 都对向量操作进行 了优化。
- 利用高速缓存一致性。
- 没有必要的话就不要复制数组。使用视图来代替复制。数组复制是非常浪 费资源的。