Python 有那么神吗
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 有那么神吗相关的知识,希望对你有一定的参考价值。
很多对Python不熟悉的人,认为Python在最近这些年的兴起是运气而已。本文帮助大家回顾一下过去十几年Python的3次增长和对应的历史背景。
Python设计之处的特点,包括易学易用,以及作为胶水语言。易学易用是个难以量化的东西,但至少我接触的绝大多数朋友都认同Python在学习和使用上是比大部分语言简单的。有些人不认同Python通常也不是认为Python相对其他语言难学,而是认为Python的运行速度慢,或者动态类型语言的通病。至于胶水语言就比较窄了,面向作为胶水而设计的语言是很少的,印象里只有Lua算得上一个。另一个Python相较其他语言的优势是字符串处理。
以下介绍Python获得发展的3次机遇期。
2006年的搜索/NLP:2006年前后正好是搜索引擎公司发展的爆发期。那一年Google中国李开复搞了关门弟子计划,百度也做了诸多广告,比如百度更懂中文系列。在那个时代搜索引擎就是IT行业的高科技。之后不久,阿里巴巴也搞了个ASC(阿里巴巴搜索技术研究中心),后来多次追潮流更名,一直作为阿里巴巴内部的前沿研发部门。
而Python用作搜索引擎和NLP是很有历史的。早期Google在90年代开发搜索引擎爬虫就是使用Python实现的。而即便是现在,开发爬虫,Python也基本上就是第一选择。很多人学习Python的入门程序也是爬虫。而Python适合开发爬虫的关键在于Python的字符串处理是很方便的。
也就是从2006年末开始,国内的python-cn邮件列表涌入了大量的新人,并以爬虫为例开始深入学习Python。
2010年的WEB创业潮:2010年开始,国内外出现了新一轮的创业潮,大家开发的是各种各样的网站。此时的WEB开发上,Python已经逐步成为主流WEB服务器开发选项中的一种。相对于同时代的Java和php等,有着开发效率上的优势。
正因为早期创业公司需要迅速的迭代和试错,使得这个时代的Python成为了一个不错的选项。进而让更多工程师开始学习起来Python。
也就是从这个时期开始,才逐渐有较多的公司会公开招聘Python工程师。在此前招聘Python工程师的广告是非常非常少见的。
2014年的Deep Learning:从2014年开始火起来的深度学习上,Python的优势是近乎绝对的。深度学习的主流开发语言只有C++和Python两种了,其他语言可以认为根本就没能在这里分到什么像样的空间。所有主流的Deep Learning框架,也是官方直接提供了C++和Python两种接口。而由于C++开发的难度,当前确实有不少从业工程师是直接用Python搞定深度学习的相关步骤。
这次Python的增长期被更多不了解Python的人认为是Python的狗屎运。但其背后的逻辑反倒是非常坚固的。原因就是Python是个很好的胶水。最初的起点是numpy库。
numpy是封装了BLAS的科学计算库。BLAS是对CPU向量指令集高度优化的数学运算库。通过BLAS进行科学计算可以得到顶级的计算性能,这个计算性能比未经向量指令集优化的C程序还能快上数倍。而numpy的另一个重要特点就是,把buffer做了封装,使得buffer的内容是无需Python处理的,而是实际交给特定的软件库来处理,numpy只是负责维护该buffer的生命周期,形状等元数据。这就使得numpy的计算性能不会受到Python的影响,但同时却可以利用Python的易学易用来管理buffer的生命周期。
numpy对buffer的管理带来的易用性优势在后来得到了很大的发展。如以下几点:
OpenCV:在opencv-python中就是使用了numpy.array来管理图像数据,却没有像C++接口一样使用Mat。同样的顶级性能。
PyCuda/PyOpenCL:也是利用了numpy.array来透明传递数据给GPU做高性能计算。尤其是集成了JIT,使得可以用字符串的方式传递kernel function,不再像C++一样要独立编译一遍。
Caffe/TensorFlow:同样利用了numpy.array,并利用了PyCuda/PyOpenCL的集成。
所以这样一路发现下来,由Python是个好胶水,就真的把若干很好用的库全流程的粘在了一起。在流程集成上都是顶级的性能,而没有Python的性能损耗,同时带来了非常好的易用性。
相比其他语言,对这些C/C++库的玩法都是先封装一层对象,包准封装的前后对不上。而且因为大部分语言并不是面向胶水设计,开发C接口都很困难。自然与这些高性能计算库的结合困难重重。累计起来就与Python产生了差距。
题主所提到的R语言,是一种领域相关的语言,是做统计领域的,类似的还有做科学计算的Matlab。如果程序的输出只是一份报告,甚至一份统计图,问题是不大的。但想要成为产品,与其他系统集成则成了难题。一般的服务器部署产品,是不会选择在工程上这么不专业的语言。所以,实际应用时,还是要有工程师负责将算法提取出来,移植到产品级的语言和平台上。举个例子,R虽然可以正常的访问mysql数据库之类的。但产品级系统中,涉及到memcache、kafka、etcd等,可就没有R语言的接口了。所以这些领域相关语言,写一些自己电脑上跑的小程序还可以,进入产品是没什么希望了。
再者就是因为通用性一直难以跨越出自己的领域,所以这类语言的生命周期一般都不太长,失去自己领域的强支撑后会很快消亡。所以建议题主还是花一些精力去看看业界通用的一些语言。
1、数据库:Python在数据库方面很优秀,可以和多种数据库进行连接,进行数据处理,从商业型的数据库到开放源码的数据库都提供支持。例如:Oracle, My SQL Server等等。有多种接口可以与数据库进行连接,至少包括ODBC。有许多公司采用着Python+MySQL的架构。因此,掌握了Python使你可以充分利用面向对象的特点,在数据库处理方面如虎添翼。
2、多媒体:利用PIL、Piddle、ReportLab 等模块你可以处理图象、声音、视频、动画等,从而为你的程序添加亮丽的光彩。动态图表的生成、统计分析图表都可以通过Python来完成。
3、web开发框架:django是流行的web开发框架,使用优雅的python语言写成。采用MVC的软件设计模式,主要目标是使得开发复杂的、数据库驱动的网站变得简单。
4、科学计算说起科学计算,首先会被提到的可能是MATLAB。然而除了MATLAB的一些专业性很强的工具箱还无法替代之外,MATLAB的大部分常用功能都可以在Python世界中找到相应的扩展库。
5、网络编程: Python可以非常方便的完成网络编程的工作,提供了众多的解决方案和模块,可以非常方便的定制出自己的服务器软件,无论是c/s,还是b/s模式,都有很好的解决方法。
6、游戏编程:Python在很早的时候就是一种游戏编程的辅助工具。在《星球大战》中扮演了重要的角色。目前,通过Python完全可以编写出非常棒的游戏程序。
虽然现在Python是被公认的最好的编程语言,但是也有它的缺点。
- 强制缩进:这也许不应该被称为局限,但是它用缩进来区分语句关系的方式还是给很多初学者带来了困惑。即便是很有经验的Python程序员,也可能陷入陷阱当中。最常见的情况是tab和空格的混用会导致错误,而这是用肉眼无法分别的。
- 单行语句和命令行输出问题:很多时候不能将程序连写成一行,如import sys;for i in sys.path:print i。而perl和awk就无此限制,可以较为方便的在shell下完成简单程序,不需要如Python一样,必须将程序写入一个.py文件。
(对很多用户而言这也不算是限制)
为什么这么多人学Python呢?
Python最现在大数据在各行各业的火爆助推了Python的进一步发展,大的优点就是简单易用。这个语言有着直观的语法并且还是个强大的多用途语言。这一点在大数据分析环境中很重要,并且许多企业内部已经在使用Python了,比如Google,YouTube,迪士尼,和索尼梦工厂。还有,Python是开源的,并且有很多用于数据科学的类库。所以,大数据市场急需Python开发者,不是Python开发者的专家也可以以相当块速度学习这门语言,从而最大化用在分析数据上的时间,最小化学习这门语言的时间。
零编码制作报表真地可能吗?
很多报表工具都把零编码作为宣传口号,这是真的吗,真的能减少到零吗,真有那么神吗?
简单情况下能做到零编码
当数据来源,表格样式和计算都比较简单时,确实可以做到零编码,比如只需要把数据select出来后展现,这样的情况,大部分工具,都可以通过拖拽来完成报表,是真正的一个字符都不需要输入的零编码
上面这类简单的列表、分组、交叉报表,都是可以通过拖拽生成的,格子中的汇总统计等简单公式,也可以通过点选按钮来自动生成,是真正的零编码
等公式稍复杂一些,就不能自动生成了,就得手动输入一下了
比如上面例子里我们要加个订单金额的统计项,订单金额=单价* 数量 *(1-折扣),这个就只能手写了
虽然需要手写,但这样的公式非常简单,在工程师眼中不能算作编码,所以这样的报表也可以算零编码的报表
再看更复杂一些的,排名、同比环比,多源分片等,逻辑更复杂,写的也就更复杂了
到这里,我们仍然可以勉强把这些算作是零编码,毕竟公式再复杂也不会有程序代码复杂,这几行公式,比起不用工具手写报表的代码量,不知道要少了多少了
把上面的报表都能算作零编码的,我们会遗憾地发现,所谓的零编码能做的表大概也就到此为止了,数据计算再复杂一些的,就不能硬说是没有编码了,而实际应用中这类复杂的报表恰恰还是占比比较多的
复杂情况下只能追求少编码
报表的复杂情况主要体现在两个部分,1是表格内计算复杂,2是前期数据准备复杂,这两个方面,都需要一定的编码了,不同的报表工具因为能力的不同,编码量的多少也不同,能力强的编码就少一些,能力弱的,编码多一些
我们仍然是通过实际例子来看看各种复杂情况下报表工具的编码量情况
先看一个函数能力强弱的例子
表格内的复杂计算,有些情况下之所以复杂是因为产品的函数能力较弱导致的,比如要算5个10,有乘法函数的,直接5*10就可以,没有的,只能用加法算,10+10+10+10+10
我们通过成绩表,做一个如下的报表
我们主要看最下面一个格子的数据,要算出提升最快的三位同学
大部分工具都没有专门做这样计算的函数,都需要设置辅助格,先对名次变化幅度做个排名,然后再根据幅度排名获取前三位,比如下图中的H3格
这样原本B4一个格子的计算,就需要多弄一个辅助格才能完成,不仅写起来复杂,数据多的时候还会影响性能
如果有高级函数的工具,算起来就方便了,B4一个格子写个表达式就算完了,比如下面润乾报表中的SPL函数:+string(esproc(“?.m(?.ptop(-3))”,B3,K3))
可见,同样的计算,报表工具中函数能力的不同,会导致零编码的程度截然不同。同样都号称零编码,但其零编码适应的范围,对于不同工具是完全不同的
再看看表格内多步计算的
有些表格内计算更复杂的情况,需要多步、分步计算,单一函数能力无法覆盖,那就得用更复杂的过程去算,但是这个过程也有很大差异,有的一步都少不了,有的可以三步并两步,写的少还算的快
上例子,我们从如下销售数据中取出指定时段的大客户
所谓大客户,定义为销售额占前一半的客户,也就是把客户销售额从大到小排序后,前面若干个客户的合计销售额构成总销售的一半,这些客户被称为大客户
报表结果:
可以看到数据和表样其实都很简单,但是制作的时候计算却不简单,需要分多步在报表中完成计算才可以,大部分的报表工具,都是先在报表格子中算出销售额总计、累计销售额,然后进行数据判断来确定哪些客户是大客户并对数据统计,最后再将这些用于中间过程计算,但却不需要显示的辅助行列隐藏掉,报表才算完成,比如下图中的B2和C3
这样的,通过一堆辅助格和公式去一步步算,虽然看起来还是没有写代码,但捋清楚逻辑也挺费时间,复杂度甚至比写代码还高了
如果像润乾报表那样有自己独有的计算引擎,使用内置脚本来处理这类多步、逻辑复杂的计算就简单了很多
简单几句脚本直接把需要的结果集计算出来返回,报表模板只要的常规行式报表设计就可以了
这一下,就节省出了不少的工作量
零编码的目的是减少工作量,降低复杂度,但如果复杂的计算只能一步步在辅助格里通过公式来算,弄出一大堆没用的格子和公式来处理数据,这样的零编码反倒不如去编码来的更快了,只有工具具备强力的数据处理能力,才能正真的做到少编码、更接近零编码
再来看一个前期数据准备复杂的
前面的两个例子都是数据准备好以后,在格子中的计算比较复杂需要编码的情况,实际应用中,数据准备的过程才是更复杂的场景,才是更需要大量编码的地方,我们来看看报表工具有没有能力在这个过程中实现零编码
例子:报表中需要呈现连续上涨超过 3 天的股票
这样的报表,制表时候只需要设计几个格子,很简单,但数据准备却不简单,大部分的工作量都得花在这个数据的准备上
用 SQL 来算的话,得写 好几层嵌套
SELECT code, MAX(ContinuousDays)
FROM (
SELECT code, NoRisingDays, COUNT(*) ContinuousDays
FROM (
SELECT code,
SUM(RisingFlag) OVER (PARTITION BY code ORDER BY day) NoRisingDays
FROM (
SELECT code, day,
CASE WHEN price>
LAG(price) OVER (PARTITION BY code ORDER BY day)
THEN 0 ELSE 1 END RisingFlag
FROM tbl
)
) GROUP BY NoRisingDays
)
GROUP BY code
HAVING MAX(ContinuousDays)>=3
这个SQL,无论如何要算成是编码了,有多年经验的程序员都不一定能驾驭。而且,这种编码是省不掉的,只能想办法简化,追求少编码了
我们继续用SPL脚本去写一下,看看能减少多少编码
A | |
---|---|
1 | =mysqlDB.query@x(“select * from tbl”) |
2 | =A1.sort(day).group(code).select(.group@o(price>price[-1]).max(.len())>3).(code) |
短短两行就可以搞定,而且逻辑更清晰易懂了
(注释:导入股市数据表,并按日期排序。使用函数 group 的选项 @o,根据股价是否上涨进行分组。分组时只和相邻的对比,当股价是否上涨发生变化时产生新组。计算出每支股票连续上涨的最大天数,最后选出连续上涨超过 3 天的)
这个SQL还只是一个很简单的计算例子,实际应用中的数据准备场景大都要比这个复杂,有些甚至要复杂百倍千倍,成百上千行的SQL和存储过程也是总能见到的
这样大的编码量,大部分的报表工具别说是把它变成零编码,就算是少一行都基本是无能为力的,能像上面的例子一样用专业计算工具SPL把编码量减少一部分就是最好的结果了
另外如果数据源不是关系数据库,而是文本、NoSQL、JOSN这些,那这个前期数据准备就更是去写代码了,报表工具号称的零编码就更是口号有余但力不足了
当然,用SPL这样的计算工具去处理,去做准备,仍然有一定的编码量,但还是能减少不少开发量,这时候我们就不是追求零编码,而是追求少编码了
通过上面3个例子可以看出,涉及格内复杂计算和复杂数据准备过程的报表,所有报表工具想通过简单的零编码方式来实现都是绝无可能的,都得工程师去费时间捋顺其中的逻辑,然后去写公式和代码才能做出来的
不同之处在于,计算能力较强的工具,可以利用它的高效函数和算法,使得编码量少而简单,更接近零编码,能力一般的,那就还是得费劲去硬编码了
总结
报表工具的设计初衷,旨在减少手工设计报表的编码量,能真正做到少编码的就已经算作是好产品了,至于零编码,那是少编码的终极状态,是各工具远没有达到的,也是需要去持续努力才能一步步接近的
润乾报表资料
以上是关于Python 有那么神吗的主要内容,如果未能解决你的问题,请参考以下文章