使用工具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來加你的程序。