「python训练营」数据分析:寻找Python最优计算性能

1、场景描述在数据统计分析过程中 , 求累计值(总和)是最常用的统计指标之一 , 市面上的各种流行数据库均支持的查询方式基本如下:
selectsum(c)fromtable_name;
当数据量在小规模时 , sum只是一瞬间的事情 , 让你感觉电脑真牛逼啊 , 我掰手指头要算半天的数 , 它居然可以这么快 , 下面是1万多条数据的字段求和 , 只用了8ms 。
「python训练营」数据分析:寻找Python最优计算性能
文章图片
但是当数据量不断增长到一个量级时 , 比如说 , 先定个小目标:一亿条订单求总额 , 你可以尝试在常规的数据库上执行同样的语句需要多长时间 。
在我的电脑上执行这样的查询 , 大约需要10s 。
「python训练营」数据分析:寻找Python最优计算性能
文章图片
或者更大的量级 , 十亿、百亿、万亿?你一秒钟给我算出来 , 哈哈 , 电脑也算懵逼了 。
「python训练营」数据分析:寻找Python最优计算性能
文章图片
采用分布式存储、分布式计算 , 是目前解决大规模计算的通用方法 , 让你吃100个馒头 , 估计一礼拜也吃不完 , 做慈善 , 一人一个分给班里的同学 , 几分钟就没了 , 吃不完的那个放学别走 。
2、举栗说明今天我们不讲分布式计算 , 先看看如何在单机上达到最优的计算性能 。
以下的示例 , 用python语言模拟求1亿条订单金额的平均值 。
大家注意:我国小学生以后的课程都有python了 , 在未来编程是个基本技能 。
2.1首先用传统的ForLoop方式
还是一亿条数据跑分
「python训练营」数据分析:寻找Python最优计算性能
文章图片
结果:
「python训练营」数据分析:寻找Python最优计算性能
文章图片
看来也不快啊 , 花了十几秒 , python在没有特定优化的前提下 , 比Java , Go语言慢了不少 。
2.2内置sum函数上场
不过我们知道python有内置的sum函数 , 是不是会快一点?让我们来试试:
「python训练营」数据分析:寻找Python最优计算性能
文章图片
结果:
「python训练营」数据分析:寻找Python最优计算性能
文章图片
不到十秒 , 快了一点点 , 但还是不理想 。
2.3神兵numpy
听说有个numpy库 , 可以向量化(vectorization)执行各种运算 , 牵到台上看看:
「python训练营」数据分析:寻找Python最优计算性能
文章图片
结果:
「python训练营」数据分析:寻找Python最优计算性能
文章图片
哎呀48毫秒 , 真心牛逼啊 , 足足快了几百倍 , 比Go、Java都快 , 不信你可以自己写个Go语言的版本对比一下 。
2.3没完
听说还有个叫numba的 , 看简写nb也很NB , 要不把刚才的那些再跑一遍瞧瞧:
「python训练营」数据分析:寻找Python最优计算性能
文章图片
可以看出numba对ForLoop的提升明显 , 对内置sum和numpy向量化影响不大 。
来个最终对比图 , 一目了然(柱子越低性能越好):
「python训练营」数据分析:寻找Python最优计算性能
文章图片
3、结论:磨刀不误砍柴工现在有些数据库为了满足OLAP的需求 , 已经集成了向量化处理 , 通过测评 , 的确是显著提高了数据分析统计的性能 , 限于篇幅 , 今天不在此展开了 。


推荐阅读