数据分析:寻找Python最优计算性能
1、场景描述
在数据统计分析过程中,求累计值(总和)是最常用的统计指标之一,市面上的各种流行数据库均支持的查询方式基本如下:
select sum(c) from table_name;
当数据量在小规模时,sum只是一瞬间的事情,让你感觉电脑真牛逼啊,我掰手指头要算半天的数,它居然可以这么快,下面是1万多条数据的字段求和,只用了8ms。
但是当数据量不断增长到一个量级时,比如说,先定个小目标:一亿条订单求总额,你可以尝试在常规的数据库上执行同样的语句需要多长时间。
在我的电脑上执行这样的查询,大约需要10s。
或者更大的量级,十亿、百亿、万亿?你一秒钟给我算出来,哈哈,电脑也算懵逼了。
采用分布式存储、分布式计算,是目前解决大规模计算的通用方法,让你吃100个馒头,估计一礼拜也吃不完,做慈善,一人一个分给班里的同学,几分钟就没了,吃不完的那个放学别走。
2、举栗说明
今天我们不讲分布式计算,先看看如何在单机上达到最优的计算性能。
以下的示例,用python语言模拟求1亿条订单金额的平均值。
大家注意:我国小学生以后的课程都有python了,在未来编程是个基本技能。
2.1 首先用传统的For Loop方式
还是一亿条数据跑分
结果:
看来也不快啊,花了十几秒,python在没有特定优化的前提下,比Java,Go语言慢了不少。
2.2 内置 sum 函数上场
不过我们知道python有内置的sum函数,是不是会快一点?让我们来试试:
结果:
不到十秒,快了一点点,但还是不理想。
2.3 神兵numpy
听说有个numpy库,可以向量化(vectorization)执行各种运算,牵到台上看看:
结果:
哎呀48毫秒,真心牛逼啊,足足快了几百倍,比Go、Java都快,不信你可以自己写个Go语言的版本对比一下。
2.3 没完
听说还有个叫numba的,看简写nb也很NB,要不把刚才的那些再跑一遍瞧瞧:
可以看出numba对For Loop的提升明显,对内置sum和numpy向量化影响不大。
来个最终对比图,一目了然(柱子越低性能越好):
3、结论:磨刀不误砍柴工
现在有些数据库为了满足OLAP的需求,已经集成了向量化处理,通过测评,的确是显著提高了数据分析统计的性能,限于篇幅,今天不在此展开了。
Python numpy库主要提供:
ndarray,速度快且空间高效的多维array,可进行向量化算术操作和更高级推广应用能力。
标准数学函数,可快速执行整个array上的数据操作,而不需要写循环:
比如说arr = np.array([[1.,2.,3.],[4.,5.,6.]]),可以进行arr * arr,arr * 0.5,1/arr等运算,这些运算都是对array中的元素做相应的计算,即向量化的操作。
- Hadoop(十二)MapReduce概述
- 安卓第一夜 第一个应用
- spring cloud 学习(1) - 基本的SOA示例
- SVN冲突
- 什么叫微信小程序分销系统?如何通过分销系统来实现你的创业梦
- Hadoop(十一)Hadoop IO之序列化与比较功能实现详解
- 安卓第五夜 维纳斯的诞生
- Eclipse中Project的Deployment Assembly(部署程序集)消失了
- spring-boot 速成(9) druid+mybatis 多数据源及读写分离的处理
- Python标准库14 数据库 (sqlite3)
- spring cloud 学习(4) - hystrix 服务熔断处理
- Hadoop(十)Hadoop IO之数据完整性
- Tomcat 端口号修改
- Mac OSX网络诊断命令
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP实现简单的协程任务调度demo示例
- YII2.0框架行为(Behavior)深入详解
- php数组函数array_push()、array_pop()及array_shift()简单用法示例
- PHP+MySQL+sphinx+scws实现全文检索功能详解
- php封装的page分页类完整实例代码
- Thinkphp自定义生成缩略图尺寸的方法
- Yii框架中使用PHPExcel的方法分析
- 详解python使用pip安装第三方库(工具包)速度慢、超时、失败的解决方案
- Laravel框架自定义分页样式操作示例
- 使用composer 安装 laravel框架的方法图文详解
- laravel5.6 框架操作数据 Eloquent ORM用法示例
- Python版名片管理系统
- docker-compose部署php项目实例详解
- Linux下通过sed命令对kv方式的配置文件进行修改
- laravel5.6框架操作数据curd写法(查询构建器)实例分析