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编写程序是更合适的选择。


Category golang