1.使用OpenCV測量性能
1.1常用函數:
retval=cv.getTickCount()
retval=cv.getTickFrequency()
1.2固定寫法:
# use getTickCount() to get time
e1 = cv.getTickCount()
# CODE
e2 = cv.getTickCount()
time = (e2 - e1)/cv.getTickFrequency()
print(time) #結果以秒為機關
# 使用time.clock()計時
start = time.clock()
# CODE
elapsed = (time.clock() - start)
print(time) #結果以秒為機關
2.OpenCV中的預設優化
許多OpenCV函數都是使用SSE2、AVX等進行優化的。它還包含未加密的代碼。是以,如果我們的系統支援這些特性,我們就應該利用它們(幾乎所有現代處理器都支援它們)。編譯時預設啟用它。是以,如果OpenCV啟用了優化代碼,它将運作優化後的代碼,否則它将運作未經優化的代碼。可以使用cv.useoptimization()檢查是否啟用/禁用了它,并使用cv.setuseoptimization()啟用/禁用它。
一般情況下 OpenCV 的函數要比 Numpy 函數快。是以對于相同的操 作最好使用 OpenCV 的函數。當然也有例外,尤其是當使用 Numpy 對視圖 (而非複制)進行操作時。
3.在Ipython中檢測效率
有時您可能需要比較兩個類似操作的性能。IPython提供了一個神奇的指令timeit來執行此操作。它運作代碼較少的次數獲得更精确的結果。同樣,它們也适用于測量單行代碼。
Python标量操作比Numpy标量操作快。是以,對于包含一兩個元素的操作,Python标量優于Numpy數組。當數組的大小稍微大一點時,Numpy就會發揮作用。
我們試一個例子。這一次,我們将比較相同圖像的cv.countNonZero()和np.count_nonzero()的性能。
In [35]: %timeit z = cv.countNonZero(img)
100000 loops, best of 3: 15.8 us per loop
In [36]: %timeit z = np.count_nonzero(img)
1000 loops, best of 3: 370 us per loop
OpenCV函數比Numpy函數快25倍。
通常,OpenCV函數比Numpy函數更快。是以,對于相同的操作,OpenCV函數是首選的。但是,也有例外,特别是當Numpy使用視圖而不是副本時。
4.效率優化
- 盡量避免使用循環,尤其雙層三層循環,它們天生就是非常慢的。
- 算法中盡量使用向量操作,因為 Numpy 和 OpenCV 都對向量操作進行 了優化。
- 利用高速緩存一緻性。
- 沒有必要的話就不要複制數組。使用視圖來代替複制。數組複制是非常浪 費資源的。