Python-OpenCV(5)

这次咱们比较下,python的函数、numpy的函数和OpenCV的函数的效率问题,让大家对功能相同的情况下如何选择合适的函数有比较直观的认识

程序(语句)运行时间的测量

(1) python的time模块 (2) cv2.getTickCount(),返回时钟数,cv2.getTickFrequency()返回始终频率,相除即可达到运行时间 (3) Ipython的%timeit

实验1

代码:

In [1]: import numpy as np

In [2]: x = 10

In [3]: %timeit y=x**2
10000000 loops, best of 3: 49.7 ns per loop

In [4]: %timeit y=x*x
10000000 loops, best of 3: 33.1 ns per loop

In [5]: c = np.array([x])

In [6]: %timeit y=c*c
1000000 loops, best of 3: 711 ns per loop

In [7]: %timeit y=c**2
1000000 loops, best of 3: 727 ns per loop

In [8]: 

%timeit是Ipython提供的魔法函数,它可以使测试的语句循环多次执行,从而测出比较准确的运行时间 从上面的结果,我们可以看出:

python对标量的运算是比numpy要快的, numpy的优点在于对多维数组的处理远比python快

实验2

代码:

In [13]: import numpy as np

In [14]: import cv2

In [15]: img = cv2.imread('/home/gavinzhou/实验室/ForBlogImage/images/1.png',cv2.IMREAD_GRAYSCALE)

In [16]: img.shape
Out[16]: (397, 550)

In [17]: %timeit z=cv2.countNonZero(img)
100000 loops, best of 3: 14.3 µs per loop

In [18]: %timeit z=np.count_nonzero(img)
1000 loops, best of 3: 366 µs per loop

In [19]: 

从上面的结果我们可以看出:

一般情况下 OpenCV 的函数要比 Numpy 函数快。所以对于相同的操作最好使用 OpenCV 的函数

关于效率优化的一点建议

尽量避免使用双层三层循环,它们非常慢的

算法中尽量使用向量操作, 因为 Numpy 和 OpenCV 都对向量操作进行了优化

利用高速缓存一致性

没有必要的话就不要复制数组。使用视图来代替复制, 数组复制是非常浪费资源的

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Leetcode名企之路

【Leetcode】64. 最小路径和

给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

811
来自专栏CaiRui

网络体系结构

1.通信协议就是在网络信息传输过程中,数据通信格式的约定,是在网络中规定信息怎样流动的一组规则。它包括控制格式、分时和纠错的有关内容,它的基本功能是对外来信息进...

1955
来自专栏marsggbo

Tensorflow datasets.shuffle repeat batch方法

由结果我们可以知道TensorFlow能很好地帮我们自动处理最后一个batch的数据。

3082
来自专栏小鹏的专栏

tf API 研读2:math

TF API数学计算 tf...... :math (1)刚开始先给一个运行实例。         tf是基于图(Graph)的计算系统。而图的节点则是由操作(...

5385
来自专栏机器学习算法全栈工程师

实例介绍TensorFlow的输入流水线

在训练模型时,我们首先要处理的就是训练数据的加载与预处理的问题,这里称这个过程为输入流水线(input pipelines,或输入管道,[参考:https://...

1526
来自专栏简书专栏

基于tensorflow的一元一次方程回归预测

安装tensorflow命令:pip install tensorflow 下面一段代码能够成功运行,则说明安装tensorflow环境成功。

754
来自专栏java一日一条

使用Java 8函数式编程生成字母序列

在 Java 8 中使用函数式编程生成字母序列是一个很大的挑战。Lukas Eder 愉快地接受了这个挑战,他将告诉我们如何使用 Java 8 来生成ABC的序...

382
来自专栏cs

python爬虫知识回顾

最常用的requests库, 通过requests对象的get方法,获取一个response对象。jsp的东西。

683
来自专栏Deep Learning 笔记

MNIST__数字识别__SOFTMAX

本次MNIST的手写数字识别未采用input_data.py文件,想尝试一下用原始的数据集来运行这个DEMO。

1071
来自专栏网络和编程

float类型加法精度损失问题(C++)

奇怪的就是:a依然是406682816,并没有加一。网上查了一些资料,这里分享一下原因。

45815

扫码关注云+社区