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 条评论
登录 后参与评论

相关文章

来自专栏小樱的经验随笔

pandas用法小结

1062
来自专栏小鹏的专栏

Pandas处理csv表格

可以结合这篇使用:数据处理利器Pandas使用手册 1)读取csv文件 data =pandas.read_csv(‘test.csv’) //返回的是Data...

2375
来自专栏IT开发技术与工作效率

VBA数据透视表

933
来自专栏微信公众号:Java团长

Java基础06 组合

我们已经尝试去定义类。定义类,就是新建了一种类型(type)。有了类,我们接着构造相应类型的对象。更进一步,每个类型还应该有一个清晰的接口(interface)...

502
来自专栏xingoo, 一个梦想做发明家的程序员

[翻译]CURAND Libaray--Host API--(2)

2.3 返回值 所有的CURAND host端的函数返回值都是curandStatus_t.如果调用没有错误,则返回成功,即返回值为CURAND_STATUS_...

18110
来自专栏nimomeng的自我进阶

Collection官方文档

a) Keys必须实现NSCopying协议。添加成员的方法并不将每一个key直接进行添加,而是将每一个key进行copy并将copy后对象添加...

854
来自专栏ATYUN订阅号

PyTorch 4.0版本迁移指南

欢迎阅读PyTorch 0.4.0的迁移指南。在此版本中,我们引入了许多振奋人心的新功能和重要的bug修复,旨在为用户提供更好,更清晰的接口。在这个指南中,我们...

1042
来自专栏Vamei实验室

Java基础06 组合

我们已经尝试去定义类。定义类,就是新建了一种类型(type)。有了类,我们接着构造相应类型的对象。更进一步,每个类型还应该有一个清晰的接口(interface)...

1938
来自专栏GAN&CV

tensorflow:提示找不到Adam或者RMSProp变量,Did you mean to set reuse=None in VarScope?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25737169/article/d...

742
来自专栏Golang语言社区

go(golang)中的类型转换

在使用 go 这样的强类型语言时,我们常常会遇到类型转换的问题。比如 int 类型转 int64,interface{} 转 struct ,对一种类型取指针、...

42610

扫码关注云+社区