• 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. 没有必要的话就不要复制数组。使用视图来代替复制。数组复制是非常浪 费资源的。
  • 相关阅读:
    自用封装javascript函数
    Jquery跨域获得Json
    【M13】以by reference 方式捕捉exceptions
    【M12】了解“抛出一个exception”与“传递一个参数”或“调用一个虚函数”之间的差异
    【48】认识template元编程
    【44】将与参数无关的代码抽离templates
    【23】宁以non-member、non-friend替换member函数
    【22】将成员变量声明为private
    【21】必须返回对象时,别妄想返回器reference
    【转】C++对象内存分配问题
  • 原文地址:https://www.cnblogs.com/blog-xyy/p/11184357.html
Copyright © 2020-2023  润新知