阿布云

你所需要的,不仅仅是一个好用的代理。

Python在开发中使用的10大误解(二)

阿布云 发表于

4.png

误解 6: Python速度慢

首先,很重要的一点是:Python是一种编程语言,不是一个运行环境。下面列举几种Python的主要实现:

  1. CPython是参考实现,它的分布和使用也最为广泛。
  2. Jython是一种成熟的实现,是在Java虚拟机上使用的Python。
  3. IronPython是用微软的公共语言库即.NET实现的Python语言。
  4. PyPy是一种很有前途的Python语言的实现,具有一些高级特性,如JIT编译器,增量垃圾收集等等。

每种运行时都有它自身的性能特点,它们中没有一个本身是慢的。更重要的一点是这里存在一个错误,即对一种编程语言进行性能评估。应该对一个应用程序,最好是针对一个特定的用例进行评估。

为了使问题更明确,这里筛选了几个案例来说明Python有非常大的性能优势:

  1. 使用NumPy作为英特尔公司数学核心函数单指令多数据的接口
  2. PyPy的JIT编译器达到了比C语言更快的性能
  3. Disqus的用户规模从2.5亿增长到5亿,一直都是使用同样的100台服务器

诚然,这些都不是最新的例子,只是我最喜欢的,因为这将很容易扯到高性能Python和独特运行时的广阔世界。我们应该将注意力应该转移到一些通用的,影响开发者提高最终产品性能的问题上,尤其是企业级环境上,而不是解决单个特殊的问题。

C++与Python的对比,两种语言,同一输出

只要有足够的时间,一个受过训练的开发人员可以执行唯一行之有效的方法,从而获得准确的高性能的软件:

  1. 工程师的正确行为,包括相应的测试开发
  2. 概括和测量性能,识别瓶颈
  3. 优化,适当考虑测试套件和阿姆达尔定律,同时利用Python在C语言方面强大的根源关系。

这也许听起来简单,但即使对于经验丰富的工程师,这也是一个非常耗时的过程。Python从设计之初就充分考虑过开发者的时间表。根据我们的经验,Python项目经受3次甚至更多的迭代并不稀罕,而同样的时间,C++或Java项目只需要做一次。今天,PayPal和eBay已经看到了多个成功的案例,Python项目超越了C++和Java的同行,使用更少的代码,这一切都得益于快的开发时间可以进行仔细的裁剪和优化。你应该知道这些有趣的内容。

误解 7: Python不能扩展

关于扩展有多种定义,但无论哪种,YouTube都是一个可扩展的网站。每月都有超过10亿的独立访客,每分钟上传超过100小时的视频,占用20%的互联网络峰值带宽,这些都用Python作为核心技术。Dropbox,Disqus,Eventbrite,RedTwilio,Instagram,Yelp,EVE Online, Second Life, 是的,还有eBay和PayPal,这些案例证明Python的扩展性不仅仅只是可能,还是一种模式。

简单性和一致性是成功的关键。CPython这个基本的Python虚拟机,使这些特征最大化,同时也使运行时间可以预测。很难看到Python程序员关注垃圾收集中止或应用程序启动时间。随着强大的平台和网络支持,Python自然地适应了智能的横向可伸缩性,主要表现在像BitTorrent这样的系统中。

此外,伸缩性是与所有测量和迭代有关。Python建立的初衷是分析与优化。误解6可以找到更多关于如何垂直扩展Python的内容。

误解 8: Python缺乏好的并发性支持

在消除了性能和伸缩性的误解后,一些人试图从技术方面来置疑Python,“Python缺乏并发性”,或者,“Python的GIL怎么样?”,如果数十个反例还不足以支撑一个人对Python在水平和垂直方面的扩展能力的信心,那么对CPython的详细实现展开来解释也没有什么帮助,所以我只进行简单的说明。

Python有大量的并发性原语,包括generators,greenlets,Deferreds和futures。Python有非常多的并发性框架,包括eventlet,gevent和Twisted。目前已有大量的工作投入到了为并发性定制运行时间,包括Stackless和PyPy。所有这些以及更多的案例表明有效地使用Python进行并发编程不乏其人。所有这些企业级的产品都得到了官方支持和使用。例子可以参考误解7。

全局解释器锁或GIL是在Python大多数使用情况下的性能优化,也是CPython 代码在开发中的易用性优化。GIL可以让操作系统的线程或绿色线程使用起来更容易,同时不影响多进程的使用。更多信息可以参考这个主题的Q&A和Python文档的综述。

在PayPal,一个典型的业务配置需要多台机器承担,采用多进程,多线程,和大量的绿色线程,达到一个非常强大和可扩展性的并行环境(见下图)。在大多数企业级环境中,当事人出于谨慎和灾难居处的目的,倾向于选择一个非常高的配置。然而,在某些情况下,仍然能看到Python服务器每天每台机器有数百万次的请求,但它们都可以轻松的处理。

一个处在基于协同的异步架构内的工作草图,最外面的盒子是一个进程,下一级是线程,在线程内是“绿色线程”。操作系统处理线程间的抢占,I/O协同是合作的。

1.png

误解 9: Python程序员稀缺

这个误解有一些道理。Python的网页开发工程师不如PHP和Java那么多。这可能是由于行业需求和教育的联动导致的,但教育趋势表明这很有可能会被改变。

即便如此,Python开发者并不稀缺。全世界有数以百万计的Python开发人员,几十个Python会议,StackOveflow上几万个Python相关的问题,一些公司,如YouTube,美国银行,和LucasArts/Dreamworks雇用了成千上万的Python开发人员。在eBay和PayPal,我们有数百名开发人员经常使用Python,为什么会这样呢?

一个项目创建的时候为什么选择Python?Python非常容易学习,而且对孩子,大学生和在职人员来说也是首选编程语言。在eBay,对一个新Python程序员来说,只需要一周时间,他就能够初见成效,往往在2到3个月就可以大放异彩,互联网上丰富的互动式教程,书籍,文档和开源的代码库,使这一些变得可能。

另一个重要因素是使用Python的项目比其它项目需要的开发人员要少。正如误解6和9中所说的,像Instagram这样的精干、高效的团队,在Python项目中已成为一个常见的比喻,这也无疑是我们在eBay和PayPal的经验。

误解 10: Python不适合做大项目

误解7中讨论了Python项目在运行时的扩展性,但Python项目在开发中的扩展性又怎样呢?如误解9中提到的,Python项目的人员不是很多。然而,Instagram达到每天亿万次的点击和数10亿美元,整个公司仍然只有一组数十人的团队。Dropbox在2011年仅有70名工程师,其它Python团队的情况也很类似,人员不多。所以Python可以扩展到一个很大的团队吗?

美国银行实际上有超过5000名Python的开发人员,一个单独的Python项目有超过千万行Python代码。摩根大通经历了相似的转变。YouTube也有数千名工程师和数百万行代码。大的产品和大的团队每天都使用Python,它们具有卓越的模块化和封装特性,超过某一特定点后,通用开发规模基本保持不变。工具、强的约定和代码评审使大的项目易于管理。

幸运的是,Python始于一个好基线。在提交代码前,我们使用PyFlakes和其它工具去执行Python代码的静态分析,同时也坚持PEP8,即Python语言的风格指南。

最后,需要注意的是,除了误解6和7中提到的调度的明显变化外,使用Python的项目也需要更少的开发人员。我们最常见的成功案例是,一个Java或C++项目,预计需要一个3-5人的开发团队,2-6周的时间,最终由一名受到激励的开发人员仅用2-6周(或小时)完成这个项目。

这是一个奇迹,但也是现代发展的事实,并且通常是商业竞争的必需品。

干净的状态

误解可以作为有趣的消遣。围绕这些误解的讨论仍然是一些最积极和有意义的事情,包括内部的和外部的,因为从每一个误解中都能认识到Python的优势。同时也要记住,那些表面上看起来繁琐和麻烦的事情常常是兴趣稳步增长的表现,随着各行业稳定的流入,带来了持续的教育工作。希望这篇文章可以扑灭一场火焰战争,能够谈论一两个用Python实现的项目。