用 Go 替代 Python 在生产环境中进行数据分析
数据分析
介绍
目前,计算机领域正在从 IT 时代向 DT 时代迅速演进。
IT 时代,就是信息科技时代。是用信息技术改善工作效率。
DT 时代,就是数据科技时代。根据数据进行决策,改善决策效率。数据科技正在颠覆一个又一个行业的格局。最近几年,数据科学家这个新职位也成为了职场上最热门的职位。
根据数据进行决策,这个工作可以分为两个部分,一个部分是数据的采集、整理、加工和处理,另一部分是使用统计学、机器学习、人工智能等的模型从数据中提取知识进行决策。
数据和数据之间的关系,决定了基于数据决策的效果的理论上限。模型,只能无限逼近这个理论上限。
而且,现实中,简单和复杂的模型,其实际效果相差都不大。因此,如何搜集数据、处理数据、加工数据、分析数据,这样的脏活和累活,其实才是数据科学工作中最重要的工作,也是工作量最大的工作。设计模型相对来说没有那么重要。
目前,数据处理和分析,主要使用的是 Python 语言,也有一些统计学背景的从业者使用 R 语言。当然,也有人使用 SAS,SPSS,Matlab 等付费语言和软件。
Python 语言中,numpy 和 Pandas 库更是数据分析的神器。简单、灵活、强大。
探索性的数据分析和生产环境中的数据分析
但是,Python 用于数据分析,也有一些问题。Python 作为一门动态语言,有很多表现力强大的语法糖,开发效率非常高,但运行效率很低。而且 Python 语言对多线程的支持并不好。
日常进行一些探索性的数据分析,Python 是非常实用的工具。Python 开发效率高,可以快速编写出多个版本的代码,进行数据探索,寻找内部规律。
但是,一旦在生产环境中部署 Python 数据分析程序,就会暴露出 Python 程序运行性能低的问题。生产环境中并发访问量有时可能很大,如果部署 Python 的数据分析程序,由于其性能较低,需要部署大量节点,使用大量计算资源来满足并发需求。这成本就比较高了。
而且即使部署大量资源,由于 Python 程序性能较低,也难以满足某些要求快速响应的业务场景。
那么,有没有什么适合数据分析且运行效率高的语言呢?R 语言行不行呢?抱歉,R 语言虽然也非常适合编写数据分析程序,但是 R 语言的运行效率比 Python 语言还低。
我发现 Go 语言,是替代 Python 进行高性能数据分析非常适合的语言。
Go 语言
介绍
Go 语言(又叫 Golang,因为在 Go 语言刚发布时,用 Go 很难在搜索引擎搜索到 Go 语言的信息)是 Google 公司在 2007 年推出的一门静态编译型语言。Go 语言诞生的目的,是为了作为 C 语言的补充,是为了取代 C++。主要目的是为了编写后端程序。Go 语言官方至今都没有推出过前端开发框架。当然,你现在也可以找到一些第三方用 Go 语言开发的前端开发框架。GTK,QT 等都有 Go 语言对应的版本。
Go 语言的设计思想,就是简单。Go 语言只有 25 个关键字。Go 语言最强调的就是简单性,我估计可能是为了和 C++反着来吧。众所周知,C++是一门非常复杂,并且复杂性在不断攀升的语言。C++的复杂性带来了很多问题。
Go 语言是 C 语言的后继。从其设计来看,非常接近 C 语言,只是给 C 语言增加了少量功能而已。基本上就是给 C 语言添加了一些现代编程需要的少数特性:对象,接口,多返回值,协程,channel,切片,字典,垃圾回收器,闭包,错误管理,跨平台等。
Go 语言是一门静态编译型的语言,生成的是机器码,因此其程序运行效率非常高,接近 C。Go 语言的语意表达能力没有 Python 强,也没有 Python 那么多语法糖,因此其开发效率比 Python 略低,完成同样的功能需要编写稍多一些的代码。但权衡开发效率和运行效率后,我认为用 Go 替代 Python 在生产环境中进行数据分析,是非常正确的决定。
Go 语言的数据分析库
Python 中的 numpy 和 pandas,在 Go 语言中也有对应的开源软件:gonum 和 gota。gonum 和 gota,比 numpy 和 pandas 的性能要强很多。
Go 语言和 Python 语言的性能对比
Go 语言和 Python 语言一般性能对比
我在网上找到一份Go语言和Python3在一些测试用例上的性能测试对比报告。
在上述测试报告中,大部分测试用例下,Go 语言程序要比 Python 语言程序快 40 多倍。
Golang Gota 和 Python Pandas 性能对比
我们知道,在测试用例下表现好,不一定代表真实场景下表现也一样好。
因此,我分别用 Python3 的 pandas 和 Golang 的 gota 编写了一个简单的数据分析程序,模拟现实中的数据分析问题,对两者的性能进行了对比测试。
测试程序做了三件事情:
1,从 json 字符串创建数据帧(就是一个表)对象
golang 比 python 快 84 倍。
2,对数据帧的每一行累加后做平均
golang 比 python 快 218 倍。
3,对数据帧的每一行累加后做平均,再把结果作为新的列添加进数据帧
golang 比 python 快 61 倍。
因为 gota 底层用的是 gonum,pandas 底层用的是 numpy。所以,我没有对 gonum 和 numpy 单独执行性能对比测试。上述性能对比结果应该能够代表 gonum 和 numpy 的性能差异。
用 Go 替代 Python 在生产环境中进行数据分析
通过以上对比,我们看到 Go 语言在进行数据分析时,其运行效率比 Python 要高出 2 个数量级。如果在生产环境中,需要部署 100 台服务器运行 Python 程序以满足业务需要。那么如果使用 Go 语言编写数据分析程序,则可能只需要 1、2 台服务器就够了。并且能够满足某些要求响应时间非常短的业务场景。
而且,Go 语言的开发效率也没有比 Python 低太多。这买卖划得来!
但也不是说,以后我们就只需要用 Go 语言进行数据分析了。
在执行探索性数据分析任务时,通常执行一次程序后,就需要修改很多代码,然后再重新执行程序看下结果。这个过程需要重复很多轮。这种场景下,用高开发效率的 Python 编写程序是更合适的选择。
版权声明: 本文为 InfoQ 作者【良少】的原创文章。
原文链接:【http://xie.infoq.cn/article/19638e257821c1c61926c3d40】。文章转载请联系作者。
评论