OpenCV_Python官方文件8——程式效能的檢測及優化
阿新 • • 發佈:2018-12-16
OpenCV-Python Tutorials
獲取程式執行時間
OpenCV主要函式
cv2.getTickCount()
:記錄從參考點到程式執行完成的時間週期數cv2.getTickFrequency()
:返回時間頻率,即每秒鐘的時間週期數
Python主要函式
time.time()
:獲得當前時間的時間戳time.perf_counter()
:返回計時器的精準時間(系統的執行時間),包含整個系統的睡眠時間。由於返回值的參考點是未定義的,只有連續呼叫的結果之間的差才是有效的。
獲取放大影象所需要的時間
import cv2
import time
import os
os. chdir('C:/Users/lenovo/Desktop/')
bear = cv2.imread('BearBrown.jpg')
rows, cols = bear.shape[:2]
# 測試放大影象所需要的時間
# 程式執行終止的時間 - 起始時間為程式執行時間
############### OpenCV庫 ################
start = cv2.getTickCount() #函式執行前的時鐘週期數
bear_dst0 = cv2.resize(bear,(cols*2,rows*3),interpolation=cv2.INTER_CUBIC) #放大影象
end = cv2.getTickCount() #函式執行完成的時間週期數
time0 = (end-start)/cv2.getTickFrequency() #獲得放大影象所需要的時間
print(time0)
################ time庫 #################
# time.perf_counter()函式
start1 = time.perf_counter()
bear_dst1 = cv2.resize(bear,(cols*2,rows*3),interpolation=cv2.INTER_CUBIC) #放大影象
end1 = time.perf_counter( ) - start1
print(end1)
# time.time()函式
start2 = time.time()
bear_dst2 = cv2.resize(bear,(cols*2,rows*3),interpolation=cv2.INTER_CUBIC) #放大影象
end2 = time.time() - start2
print(end2)
程式優化
OpenCV 中的很多函式都被優化過,但也包含一些沒有被優化的程式碼。在編譯時優化是被預設開啟的。
cv2.useOptimized()
來檢視優化是否被開啟cv2.setUseOptimized()
:引數為True開啟優化,False關閉優化。
import cv2
import time
import os
os.chdir('C:/Users/lenovo/Desktop/')
bear = cv2.imread('BearBrown.jpg')
rows, cols = bear.shape[:2]
# 測試開啟和關閉所需要的執行時間
cv2.setUseOptimized(True)
print(cv2.useOptimized())
start = cv2.getTickCount() #函式執行前的時鐘週期數
bear_dst0 = cv2.resize(bear,(cols*3,rows*3),interpolation=cv2.INTER_CUBIC) #放大影象
end = cv2.getTickCount() #函式執行完成的時間週期數
time0 = (end-start)/cv2.getTickFrequency() #獲得放大影象所需要的時間
cv2.setUseOptimized(False) # 關閉優化
print(cv2.useOptimized())
start = cv2.getTickCount() #函式執行前的時鐘週期數
bear_dst3 = cv2.resize(bear,(cols*3,rows*3),interpolation=cv2.INTER_CUBIC) #放大影象
end = cv2.getTickCount() #函式執行完成的時間週期數
time3 = (end-start)/cv2.getTickFrequency() #獲得放大影象所需要的時間
print("開啟優化的執行時間為"+str(time0))
print("關閉優化的執行時間為"+str(time3))
執行結果:
True
False
開啟優化的執行時間為0.0073506805537736615
關閉優化的執行時間為0.01660434574697629
效率優化原則
- Python 的標算比 在Numpy 裡計算快。對於僅包含一兩個元素的運算,Python 比 Numpy 的陣列快。但當陣列元素多時Numpy 快。所以Numpy的執行速度並不一定比Python本身語法快,元素數量較少時,用Python自身的格式計算。
- 儘量避免使用迴圈,尤其兩層三層的巢狀迴圈,迭代非常慢
- 優先使用OpenCV/Numpy中封裝好的函式
- 儘量將資料向量化,變成Numpy的資料格式
- 儘量避免陣列的複製操作