Python是一种简单的、解释型的、交互式的、可移植的、面向对象的高级编程语言。它的设计哲学是优雅、明确、简单并且完全面向对象。
Python因代码量小、维护成本低、编程效率高等特点使其成为运用最广的编程语言之一,在越来越多的领域发挥了优势。具体来讲,Python具有如下特性。
面向对象
Python面向对象的程序设计可抽象出对象的行为和属性,把行为和属性分开,又合理地组织在一起,消除了保护类型、抽象类、接口等元素,使概念更容易理解。
简单
Python的语法非常简单,没有分号,使用缩进的方式分隔代码,代码简洁、短小、易读。表1.1为Python、C、Java打印Hello Word的最简单的代码对比。
表1.1 Python、C、Java打印Hello World的最简单的代码对比
易用的数据结构
Python的数据结构包括元组、列表、字典等:元组相当于数组;列表可用作可变长度的数字;字典相当于哈希表。
健壮性
Python提供了异常退出机制,能够捕获程序的异常情况,具有自动垃圾回收、内存管理机制,降低了程序因内存错误造成崩溃的概率。
跨平台性
Python会将代码先编译成与平台相关的二进制代码,再通过平台的解释器执行。Python代码可以在不同的平台运行,省去了嵌入式领域不同IC、OS需要重新编写C代码的烦琐工作,可实现一次编写,到处运行。
可扩展性
对于性能比较敏感、核心算法需要保护的情景,以及与嵌入式硬件操作相关的领域,Python均可以使用C语言进行很方便的扩展。
动态性
Python不需要另外声明变量,直接赋值即可创建新变量。
强类型
Python根据赋值表达式的内容决定变量的数据类型,在内部建立管理变量的机制,出现在同一表达式中不同类型的变量需要进行类型转换。
Python自被提出以来便发展迅速,目前的应用场景非常广泛,几乎无处不在,在很多前沿科技领域均发挥着重要的作用,具体体现在如下方面。
多媒体
利用PIL、Piddle、ReportLab等模块可以处理图像、音视频、动画等,动态图表的生成、统计分析图表等都可以通过Python实现。
科学计算
Python可以广泛地在科学计算领域发挥独特的作用,有许多模块可以在计算矩形数组、矢量分析、神经网络等方面高效地完成工作。
网络编程
Python有多个成熟的网络编程框架和服务器可用来快速实现网络编程应用的开发:Tonardo是一个多并发、轻量级的应用,非阻塞的Web容器;Twisted是一个Python应用程序和库文件的集成套件,包括全套页面服务应用程序和基于文本模式的游戏引擎,以及一些能对数据流进行处理的模块,是一个异步网络开发框架,包含可以独立运行的服务器;Django是一个具有全自动化的管理后台,可自动生成数据库结构和全功能的管理后台;Flask是基于Werkzeug WSGI工具和Jinja2模板引擎的轻量级Web应用框架。豆瓣、YouTube等网站均使用Python开发。
嵌入和扩展
Python不仅可以嵌入其他程序,也可以通过C、C++、Java等编写扩展模块,实现对硬件的操作。因此,Python适合嵌入式领域的程序开发。常用的做法是使用C语言编写硬件操作扩展库,Python通过调用C语言扩展库实现对硬件的操作。
游戏编程
Panda3D、Renpy、Bigworld等Python游戏引擎使游戏编程变得非常方便。
机器学习、大数据分析
在机器学习、大数据分析领域,Python也有众多的科学库供选择,如Numpy、Pandas、Matplitlib、Scikit-learn等。
开发者对Python的最大顾虑之一就是运行速度比较慢。有些开发者甚至因为这个原因拒绝使用Python。笔者认为不能一概而论,这里存在一些误区:首先,Python的运行速度并不是那么慢,并且Python的运行速度是可以优化的;其次,有时候Python的运行速度并不是首要考虑的因素。
优化最宝贵的资源
过去,由于最宝贵的资源是计算机的运行时间,因此CPU和内存等硬件比较昂贵,需要对硬件资源进行优化以节省成本。时过境迁,如今这条规则不再适用,很多芯片等硬件非常便宜,运行时间和硬件资源不再是最宝贵的资源。有些时候,公司最宝贵的资源是人力,把事情更快地做完更加重要。
比竞争对手更快地创新
在开发者的世界,“速度”一词通常指的是程序的运行速度,代表程序的运行效率和性能;在老板的世界,“速度”一词往往指的是业务速度,也就是产品的上市时间。
很多时候,产品程序的运行速度并不是最重要的,用什么语言编写也不是最重要的,甚至开发时需要花费多少钱还不是最重要的,缩短产品的上市时间才是最重要的。
CPU 不一定是瓶颈
如果编写一个网络应用程序时,如Web服务器,则很有可能CPU并不是程序运行速度的瓶颈,当Web服务器处理一个请求时,可能会进行几次网络调用,如访问数据库,虽然这些服务本身可能比较快速,但是网络调用却很慢。
物联网系统架构包含大量的传感器、通信模块等硬件,终端设备的主要任务是进行数据的收集和传输而不是运算,因此CPU的计算压力并不大,大部分的精力都用于IO数据的读写。
Python的速度可以优化
Python有调用C语言代码的能力,可以用C语言重写某些代码来提高程序性能。
Cython是Python的超集,几乎是Python和C语言的合并,是一种渐进类型的语言。任何Python代码都是有效的Cython代码。Cython代码可以编译成C语言代码,并逐渐扩展到越来越多的C语言类型,还可以将C语言类型和Python类型完美组合,只在关键的地方使用C语言优化,在其他地方仍然享有Python的便捷与优雅。
当Python代码产生阻碍时,不需要把整个代码库用另一种不同的语言来编写,只需要用Cython重写几个函数代码就能得到需要的性能,或者使用其他方法优化。例如,PyPy是一个Python的JIT实现,通过使用PyPy替换Cython(这是Python的默认实现),可为长时间运行的应用程序提供重要的改进。
总之:
· 优化最贵的资源,是开发者,不是计算机;
· 选择一种语言/框架/架构可快速开发,如Python;
· 当遇到性能问题时,请找瓶颈所在;
· 性能瓶颈很可能不是CPU或Python本身;
· 如果Python成为瓶颈,那么可以通过Cython、PyPy或者C语言来优化。