zoukankan      html  css  js  c++  java
  • opencv-python-学习笔记七(程序性能检测及提升)

    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.效率优化

    1. 尽量避免使用循环,尤其双层三层循环,它们天生就是非常慢的。
    2. 算法中尽量使用向量操作,因为 Numpy 和 OpenCV 都对向量操作进行 了优化。
    3. 利用高速缓存一致性。
    4. 没有必要的话就不要复制数组。使用视图来代替复制。数组复制是非常浪 费资源的。
  • 相关阅读:
    08-01集合运算
    07-03成员运算符
    07-02集合
    07-01结构与封装
    06-01字符串格式化.md
    06-03线性结构与切片
    06-02字符串与bytes
    05-02命名元组
    05-01元组
    04-01列表与常用操作
  • 原文地址:https://www.cnblogs.com/blog-xyy/p/11184357.html
Copyright © 2011-2022 走看看