事前准备:
使用工具Python3.5 使用包cv2,numpy,time,profile
涉及函数:
cv2.getTickCount,cv2.getTickFrequency
任务1 使用OpenCV检测程序效率
cv2.getTickCount函数返回从参考点到这个函数被执行的时钟数。在一个函数执行前后都调用它,可以得到这个函数的执行时间。 cv2.getTickFrequency返回时钟频率,或者说每秒钟的时钟数 例,窗口大小不同(5,7,9)的核函数来做中值滤波,查看一个函数运行了多少秒
import cv2
import numpy as np
img1 = cv2.imread('45.jpg')
e1 = cv2.getTickCount()
for i in range(5,49,2):
img1 = cv2.medianBlur(img1,i)
e2 = cv2.getTickCount()
time = (e2-e1)/cv2.getTickFrequency()
print(time)
注:python中time模块也可以实现,调用的函数是time.time()
任务2 OpenCV中的默认优化
cv2.useOptimized()来查看优化是否被开启,cv2.setUesOptimized()来开启优化。
import cv2
import numpy as np
# check if optimization is enabled
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
# Disable it
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
任务3 在IPython中检测程序效率
有时你比两个相似操作的效率时,你可以使用 IPython 为你提供的法命令%time。他会代码好几次从而得到一个准确的时间它也可以用来测试代码的。 例如你知下同一个数学算用哪种式的代码会执行得更快吗? x = 5; y = x∗∗2 x = 5; y = x∗x x = np.uint([5]); y = x∗x y = np.squre(x) 我们可以在 IPython 的 Shell 中使用法命令找到答案。
import cv2
import numpy as np
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
竟然是第一种写法它居然比 Nump 快了 20 倍。如果考到数组构建的 能到 100 倍的差。 注意:Python 的标算比 Nump 的标算快。对于仅包含一两个 元素的操作 Python 标比 Numpy 的数组快。但是当数组稍微大一点时 Numpy 就会胜出了。
任务4 效率优化技术
有些技术和编程方法可以我们大的发挥 Python 和 Numpy 的威力。 我们仅仅提一下相关的你可以接查找更多细信息。我们 的的一点是先用简单的方式实现你的算法结果正确当结 果正确后再使用上的提到的方法找到程序的瓶来优化它。 1.尽免使用循环尤其双层三层循环它们天生就是常慢的。 2.算法中尽量使用向操作因为 Numpy 和 OpenCV 对向操作 了优化。 3.利用缓存一致性。 4.没有必的就不复制数组。使用图来代替复制。数组复制是常浪源的。就算了上优化如果你的程序是很慢或者大的不可免的 你你应尝使用其他的包比如 Cython来加你的程序。
总结
(本系列每周不定期更新,谢谢大家支持!)