Performance Measurement and Improvement Techniques

1使用OpenCV测量性能

cv2.getTickCount:函数返回参考事件(如机器开启时刻)到调用此函数的时钟周期数. 因此,如果在函数执行之前和之后调用它,则会获得用于执行函数的时钟周期数.
cv2.getTickFrequency:函数返回时钟周期的频率,或每秒钟的时钟周期数.

如果要在几秒内找到执行时间:
代码:

import cv2

e1 = cv2.getTickCount()
# your code execution
e2 = cv2.getTickCount()
time = (e2 - e1)/ cv2.getTickFrequency()
print(time)

输出:
9.909108700445166e-06

2 OpenCV中的默认优化

许多OpenCV功能都使用SSE2,AVX等进行了优化,当然它也包含未经优化的代码。 因此,如果我们的系统支持这些功能,我们应该利用它们(几乎所有现代处理器都支持它们).编译时默认启用它, 因此,OpenCV运行优化代码(如果已启用),否则运行未优化代码。 您可以使用cv2.useOptimized()来检查它是否已启用/禁用,并使用cv2.setUseOptimized()来启用/禁用它.

代码

# check if optimization is enabled
cv2.useOptimized()

输出:True

# Disable it
cv2.setUseOptimized(False)
cv2.useOptimized()

输出:False

性能优化技术

有几种技术和编码方法可以利用Python和Numpy的最大性能。 此处仅注明相关的内容,并提供重要来源的链接。 这里要注意的主要是,首先尝试以简单的方式实现算法。 一旦工作,对其进行分析,找到瓶颈并进行优化。

  • 尽可能避免在Python中使用循环,尤其是双循环/三循环等。它们本身就很慢。
  • 尽可能最大程度地保存算法/代码,因为Numpy和OpenCV针对向量运算进行了优化。
  • Exploit缓存一致性。
  • 除非需要,否则不要复制数组。 尝试使用视图。 阵列复制是一项昂贵的操作。

即使在完成所有这些操作之后,如果您的代码仍然很慢,或者使用大型循环是不可避免的,请使用其他库(如Cython)来加快速度。


sakurala
84 声望37 粉丝

目前正在学习以及巩固opencv-python知识.