1、场景描述
在数据统计分析过程中,求累计值(总和)是最常用的统计指标之一,市面上的各种流行数据库均支持的查询方式基本如下:
select sum(c) from table_name;
当数据量在小规模时,sum只是一瞬间的事情,让你感觉电脑真牛逼啊,我掰手指头要算半天的数,它居然可以这么快,下面是1万多条数据的字段求和,只用了8ms。
![19fa86e4d1cd7a6e6fd51ff075a3dfec.png](https://i-blog.csdnimg.cn/blog_migrate/b288eddf768ca63f54669576a74cc56c.jpeg)
但是当数据量不断增长到一个量级时,比如说,先定个小目标:一亿条订单求总额,你可以尝试在常规的数据库上执行同样的语句需要多长时间。
在我的电脑上执行这样的查询,大约需要10s。
![9a49f4ad79ffff5ea642e8811badded5.png](https://i-blog.csdnimg.cn/blog_migrate/902d02a9598ab4f668362a9afb9e9862.jpeg)
或者更大的量级,十亿、百亿、万亿?你一秒钟给我算出来,哈哈,电脑也算懵逼了。
![ea09479b87296c5866331e653545b90c.png](https://i-blog.csdnimg.cn/blog_migrate/8f271d587b0f9def70a5419ed91303f0.jpeg)
采用分布式存储、分布式计算,是目前解决大规模计算的通用方法,让你吃100个馒头,估计一礼拜也吃不完,做慈善,一人一个分给班里的同学,几分钟就没了,吃不完的那个放学别走。
2、举栗说明
今天我们不讲分布式计算,先看看如何在单机上达到最优的计算性能。
以下的示例,用python语言模拟求1亿条订单金额的平均值。
大家注意:我国小学生以后的课程都有python了,在未来编程是个基本技能。
2.1 首先用传统的For Loop方式
还是一亿条数据跑分
![f8819160396935fcc54bcd53ee3046f7.png](https://i-blog.csdnimg.cn/blog_migrate/95c3fcf40681f33fd0b536637ff4d66d.jpeg)
结果:
![5a82687b7662a0cca9e29dbae7d0a55c.png](https://i-blog.csdnimg.cn/blog_migrate/43bc3b62a8368edd1785e80b3b4f2b25.jpeg)
看来也不快啊,花了十几秒,python在没有特定优化的前提下,比Java,Go语言慢了不少。
2.2 内置 sum 函数上场
不过我们知道python有内置的sum函数,是不是会快一点?让我们来试试:
![a65f324a2de2e200d016fd4943630716.png](https://i-blog.csdnimg.cn/blog_migrate/dca70aab1b0d41620847d41c055c9f6c.jpeg)
结果:
![a5735ed9e0d8c310fd6946126743ef42.png](https://i-blog.csdnimg.cn/blog_migrate/8e3a5e8a1897f7c6514d34c81500689a.jpeg)
不到十秒,快了一点点,但还是不理想。
2.3 神兵numpy
听说有个numpy库,可以向量化(vectorization)执行各种运算,牵到台上看看:
![3893d1c02a099f35f06166d007877bfd.png](https://i-blog.csdnimg.cn/blog_migrate/939cf4e2434ad48fdfaac70cbe017386.jpeg)
结果:
![0656048718bb38908187d4f5c2223046.png](https://i-blog.csdnimg.cn/blog_migrate/37eb8b537c2033bc9184c5bbeab68992.jpeg)
哎呀48毫秒,真心牛逼啊,足足快了几百倍,比Go、Java都快,不信你可以自己写个Go语言的版本对比一下。
2.3 没完
听说还有个叫numba的,看简写nb也很NB,要不把刚才的那些再跑一遍瞧瞧:
![34bec05e8575ea6537d64d51c4084cd8.png](https://i-blog.csdnimg.cn/blog_migrate/69a0a558c08de2220e555cb1d9eac60a.jpeg)
可以看出numba对For Loop的提升明显,对内置sum和numpy向量化影响不大。
来个最终对比图,一目了然(柱子越低性能越好):
![67c0777c07edd28a7741c184f1d7f6e3.png](https://i-blog.csdnimg.cn/blog_migrate/9626b71eced7cda282f3ebbb9b97071b.jpeg)
3、结论:磨刀不误砍柴工
现在有些数据库为了满足OLAP的需求,已经集成了向量化处理,通过测评,的确是显著提高了数据分析统计的性能,限于篇幅,今天不在此展开了。
Python numpy库主要提供:
ndarray,速度快且空间高效的多维array,可进行向量化算术操作和更高级推广应用能力。
标准数学函数,可快速执行整个array上的数据操作,而不需要写循环:
比如说arr = np.array([[1.,2.,3.],[4.,5.,6.]]),可以进行arr * arr,arr * 0.5,1/arr等运算,这些运算都是对array中的元素做相应的计算,即向量化的操作。
好了,今天就分享到这里,希望本文对大家有所帮助,如果大家觉得有用可以点个关注支持一下谢谢!
另外多说一句,对于初学者我整理了一套python系统学习教程,从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。需要这些资料的只要关注我,在后台私信回复:“01”即可免费领取。