摘要:
大学毕业到现在用的最多的编程语言还是C,C++,后来学习了一下Python,觉得Python是门学了不后悔的语言。尤其适合非程序员学习,作为青少年学习计算机的首门语言也不错,大学生学习计算机采用Python语言作为入门也不错。一个软件工程师,感觉以C+Python+HTML5+JavaScript的搭配也可以接受。对于Python语言一直存在一些误解,整理了一下网上资料,仅仅当作自己学习的乐趣,也算是给自己鼓鼓劲。
注:
这里不想讨论编程语言的优略,因为程序员都是认真的,一讨论编程语言一定会热闹起来,比如以前Linux作者林纳斯·托瓦兹的C与C++好坏争论,...... ,PHP是世界上最好的语言等等。
练武功既要练招式,也要练内功,讨论编程语言别太认真,选合适的解决自己问题的语言就好。
图:Linux之父Linus Benedict Torvalds
Python是一门新的语言:
Python语言在国内大规模流行主要是从2014年左右开始,这一点从某娘的搜索指数也可以看出。
图:几种编程语言的搜索指数趋势
由图可见,2014年前,Python在国内搜索指数很低,2014年之后逐渐增加,到2017年竟然超过了老大Java。但不要认为Python新近流行,就认为Python是新语言,其实了解Python历史的人一定知道,Python诞生于1989年,1991年发布第一个版本,其年龄比Java还大4岁。Python一个著名的早期使用的例子是1996年Google的第一个成功的网络爬虫。和Java比Python更像草根,一直默默修炼,最终大器晚成。这么多人喜好说明Python还是有它自身的优点的。
Python是解释型语言,没有被编译:
Python的确不像C、C++那样需要编译成可执行程序,但它更像Java,会将源代码编译成自己的字节码。字节码有解释器(Java称虚拟机)来处理执行。Python和Java比完全开源,没有被某个大机构掌控,解释器也比较多,如:CPython, PyPy, Jython/JVM, IronPython/CLR等等。
Python是脚本语言,不是一门独立的开发语言:
Python确实是一种面向对象的脚本语言,而且还是这个领域的先行者之一。因其语法简单,支持跨平台,并且普遍存在于Linux,Macs和其它Unix机器中。尤其是在自动化运维方面,Python语言绝对是首选。目前自动化测试也开始更多的选择Python语言。
但是不能因为其这方面强大,就忽视了Python最为一门独立编程语言的特性,事实上,Python可能是通用编程语言中最灵活、功能最强大的开发语言之一。下面给出一些实例:
1.电话基础设施(Twilio)
2.支付系统(PayPal,Balanced Payments)
3.神经科学和心理学(例子很多)
4.数值分析和工程学(numpy, numba和很多其它例子)
5.动画片(LucasArts, Disney, Dreamworks)
6.游戏后端(Eve Online, Second Life, Battlefield和很多其它例子)
7.电子邮件基础设施(Mailman, Mailgun)
8.媒体存储和处理(YouTube, Instagram, Dropbox)
9.运营和系统管理(Rackspace, OpenStack)
10.自然语言处理(NLTK)
11.机器学习和计算机视觉(scikit-learn, Orange, SimpleCV)
12.安全和渗透测试(DNSRecon、patator、XSSer、太多了,包括eBay/Paypal/)
13.大数据(Disco, Hadoop support)
14.日历(Calendar Server, which powers Apple iCal)
15.搜索系统(ITA, Ultraseek, and Google)
16.互联网基础设施(DNS) (BIND 10)
17.云计算平台(OpenStack)
18.爬虫框架(Scrapy,scrapy-redis)
19.WEB架构(Django、Flask、Tornado)
20.调试和逆向工程(很多这里不列举了)
其他例子举不胜举,可以通过互联网搜索。 当下,以Python作为主开发语言是没有任何问题的,可以作为初入行者的首门语言。
Python是弱类型语言:
Python一个明显的特性是变量是动态类型的,这不影响Python作为一种强类型语言。从某种意义上讲,Python具有比Java更强的类型系统。Java的原语和对象有各自的类型系统,Null存在于一种灰色地带。
另一方面,Python有一个统一的强类型系统,None这种类型也有明确的定义。
关于Python的类型系统,在应用中也需要注意,认真处理,否则也会带来麻烦。
Python不安全:
Python是解释型语言,通常软件发布采用源码方式,所以认为代码保密性不好,安全性不好。前面我说了,Python是支持编译的,其实Python可以是编译+解释混合型。
另外安全不能依靠编译状态的代码,更重要的是使运行环境更安全。因为本质上,每种语言都有反汇编器或可以被破解,这会破坏程序的保护状态,所以安全不能仅仅靠编译。
安全的一个核心原则是尽可能小的呈现目标。CPython通过简单的、稳定的和易于审计的虚拟机来解决这些问题。事实上,在Coverity软件最近的一个分析中,CPython得到了最高的质量评价。
Python还具有一系列广泛开源的、行业标准的安全库。将hashlib,PyCrypto和OpenSSL结合在一起,通过PyOpenSSL,进行一些处理是可以满足各种安全和性能需求的。
根据公开资料,PayPal(eBay)的应用安全组中使用Python的安全应用的例子也不少:
1.为促进密钥置换和加强加密的实现创建安全代理
2.集成行业领先的HSM技术
3.为不兼容的栈构建基于传输层安全的包装器代理
4.为我们内部双向认证机制产生密钥和证书
5.开发主动的漏洞扫描器
国内的BATJ公司也大量使用Python进行开发,此外,很多由Python构建的以运营为导向的系统都暗含安全特性,例如防火墙和连接管理等。
Python缺乏好的并发性支持:
提到Python,一定会提到Python的GIL(全局解释器锁),也一定会质疑“Python缺乏并发性”。这个确实不好说。只能简单来看吧。
Python有大量的并发性原语,包括generators,greenlets,Deferreds和futures。Python有非常多的并发性框架,包括eventlet,gevent,pulsar,toro,offset和Twisted。
目前已有大量的工作投入到了为并发性定制运行时间,包括Stackless和PyPy。所有这些,以及更多的案例表明有效地使用Python可以进行并发编程。这些企业级的产品都得到了官方支持和使用。
全局解释器锁GIL是在Python大多数使用情况下的性能优化,也是CPython 代码在开发中的易用性优化。GIL可以让操作系统的线程或绿色线程使用起来更容易,同时不影响多进程的使用。
目前大量服务器端软件采用Python开发,我们也看到Python服务器每天每台机器有数百万次的请求,但它们都可以轻松的处理。所以不能说Python缺乏并发行支持。
Python不适合做大项目:
Python主要特点之一是开发效率极高,Python项目组能以少量开发人员完成较大项目。Instagram达到每天亿万次的点击和数10亿美元,整个公司仍然只有一组数十人的团队。Dropbox在2011年仅有70名工程师,其它Python团队的情况也很类似,人员不多。同时也带来一个质疑,Python做不了大项目,组建不了打团队。Instagram,Dropbox算小项目吗?
我们看几个例子,美国银行实际上有超过5000名Python的开发人员,一个单独的Python项目有超过千万行Python代码。摩根大通经历了相似的转变。YouTube也有数千名工程师和数百万行代码。大的产品和大的团队每天都使用Python,它们具有卓越的模块化和封装特性,超过某一特定点后,通用开发规模基本保持不变。工具、强的约定和代码评审使大的项目易于管理。
编写大项目任何语言都会碰到问题,不能光靠语言约束。应该遵守合理、严格的规范,养成良好的编程素养。如:可以支持PEP8规范,在提交代码前,我们使用PyFlakes和其它工具去执行Python代码的静态分析等等。
事实上Python不仅开发效率高,更容易开发出高效,稳定的软件。
Python不能扩展:
这个有点没模糊,Python语言本身是可扩展的,Python也可以开发出就有扩展性的软件。YouTube采用Python开发,是一个可扩展的网站。每月都有超过10亿的独立访客,每分钟上传超过100小时的视频,占用20%的互联网络峰值带宽,这些都用Python作为核心技术。Dropbox、Disqus、Eventbrite、RedTwilio、Instagram、Yelp、EVEOnline、Second Life、eBay、以及PayPal,这些案例证明Python的扩展性还不赖。
简单性和一致性是成功的关键。CPython这个基本的Python虚拟机,使这些特征最大化,同时也使运行时间可以预测。很难看到Python程序员关注垃圾收集中止或应用程序启动时间。随着强大的平台和网络支持,Python自然地适应了智能的横向可伸缩性,主要表现在像BitTorrent这样的系统中。
另外两个问题:
这两个不能算是误解,可以说是事实。
1、Python运行速度慢
Python作为解释型语言,通常理解是没有C、C++这些编译型语言快。不过说Python语言比Java慢,这个有待商榷。可以从以下几个方面看这个问题,语言仅仅是一个因素,单独评估一个语言的快和慢,有时并不恰当。应该对一个应用程序,最好是针对一个特定的用例进行评估。比如用Java,Python同样实现一个软件进行评估。由于Python可以和C、C++很好的互相调用,对于真正需要性能的地方可以使用C、C++进行扩展,然后需要提高编码效率的地方用Python实现,这样写出的整体软件可能比Java还快。还有现在出现了一些优化的Python解释器,如:PyPy的JIT编译器达到了比C语言更快的性能。还有Python应用在服务器端居多,和运行速度比网络吞吐量也是瓶颈,从现有软件看,Python的运行速度不是最大问题,Disqus的用户规模从2.5亿增长到5亿,一直都是使用同样的100台服务器。提高软件的迭代速度也是要考虑的因素。Python从设计之初就把开发者的开发效率放第一位。根据经验,同样的时间内,Python项目比C++或Java项目会有更多迭代次数。
2、Python程序员稀缺
Python流行相对较晚,而且之前Python通常作为一个工程师的第二语言,Python开发工程师数量少是事实。
Python的网页开发工程师不如PHP和Java那么多。这可能是由于行业需求和教育的联动导致的,但教育趋势表明这很有可能会被改变。
Python开发的高效率,使得采用Python开发,一个较小的团队可以完成一个高效,强大的软件的开发工程。这也是一个因素。
从另外一个角度看,Python从业人员少也是相对的,Python从业人员的绝对数量也不少。全世界有数以百万计的Python开发人员,几十个Python会议,StackOveflow上几万个Python相关的问题,一些公司,如YouTube,美国银行,和LucasArts/Dreamworks雇用了成千上万的Python开发人员。
一个新建项目或者初创公司更喜好选择Python,原因如下:
Python非常容易学习,而且对孩子,大学生和在职人员来说也是首选编程语言。对一个新Python程序员来说,只需要一周时间,他就能够初见成效,往往在2到3个月就可以大放异彩,互联网上丰富的互动式教程,书籍,文档和开源的代码库,使这一些变得可能。
近年Python开发工程师岗位数量激增。从业人员薪水还算不错,所以一定会有大量的初学者入场,平均薪资被拉低也是必然。从业有风险,入行需谨慎。
图:Bruce Eckel原话是"Life is short, you need Python"