ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
使用工具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来加你的程序。