首页
学习
活动
专区
工具
TVP
发布

Python基础教程17.1 鱼和熊掌兼得

Python什么都能做,真的是这样。这门语言功能强大,但有时候速度有点慢。例如,如果要编写模拟某种核反应的程序或为下一部《星球大战》电影渲染图形,企图使用Python来编写这样的高性能代码可能不是很好的选择。Python的目标是易于使用以及帮助提高开发速度,这种灵活

性是以牺牲效率为代价的。对大多数常见的编程任务来说, Python无疑足够快,但如果你真的很在乎速度, C、 C++、 Java和Julia等语言通常要快好几个数量级。

17.1 鱼和熊掌兼得

对于坚信速度至上的读者,我并不鼓励你只使用C语言进行开发。虽然只使用C语言能提高程序本身的速度,但肯定会降低编程速度。因此你需要考虑哪一点更重要:是快速编写好程序,还是很久以后终于编写出了一个速度极快的程序。如果Python的速度足以满足需求,使用C等低级语言带来的痛苦将让这样的选择毫无意义(除非还有其他需求,比如程序将在不适合使用Python的嵌入式设备中运行)。

本章讨论确实需要进一步提升速度的情形。在这种情况下,最佳的解决方案可能不是完全转向C语言(或其他中低级语言),我建议你采用下面的方法(这可满足众多的速度至上需求)。

(1) 使用Python开发原型(有关原型开发的详细信息,请参阅第19章)。

(2) 对程序进行性能分析以找出瓶颈(有关测试,请参阅第16章)。

(3) 使用C(或者C++、 C#、 Java、 Fortran等)扩展重写瓶颈部分。

这样得到的架构(包含一个或多个C语言组件的Python框架)将非常强大,因为它兼具这两门语言的优点。关键在于选择正确的工具来完成每项任务,这样既能获得使用高级语言( Python)开发复杂系统的好处,又能使用低级语言( C)来开发较小(还可能较简单)但速度至关重要的组件。

注意 还有其他让你转而求助于C语言的原因。例如,如果要编写与怪异硬件交互的低级代码,你几乎别无选择。

如果编码前就知道系统的哪部分将是瓶颈,可以(而且可能应该)在设计原型时就确保可轻松地替换这些关键部分。对于这个观点,可能使用下面的提示来阐述更合适。

最终你可能发现并不需要使用C扩展来替换这些瓶颈(这可能是因为运行程序的计算机的速度更高了),但至少存在选择的空间。

扩展能够找到用武之地的另一种常见情形是遗留代码。你可能想重用一些代码,但这些代码是使用其他语言(如C)编写的。在这种情况下,可将这些代码“包装”起来(编写一个提供合适接口的小型C语言库),并使用这个包装器来创建Python扩展。

在接下来的几节中,我将简要地介绍如何扩展Python的经典C语言实现(为此可手工编写所有的代码,也可使用工具SWIG),以及如何扩展其他两种实现:Jython和IronPython。另外,还将讨论访问外部代码的其他方式。

反过来

本章着重介绍使用编译型语言为Python程序编写扩展。但别忘了,下面的做法也有用武之地:使用编译型语言编写程序,并在其中嵌入Python解释器来执行少量的脚本和扩展。在这种情况下,嵌入Python追求的不是速度而是灵活性。从很多方面说,这与编写编译型扩展的目的是一样的,也是为了鱼和熊掌兼得,只是重点不同。

现实世界的很多系统都使用了这种嵌入方法。例如,很多计算机游戏(它们几乎都是使用编译型语言编写的,其代码库几乎都是为最大限度提高速度而开发的)都使用诸如Python等动态语言来描述高级行为(如游戏中角色的“智力”),而主代码引擎负责图形等方面。

正文提到的CPython、 Jython和IronPython文档也讨论了嵌入方法,以帮助你采用这种方法。

如果你要使用速度很快的高级语言Julia( http://julialang.org),同时访问既有的Python库,可使用PyCall.jl库( https://github.com/stevengj/PyCall.jl)。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190612A035ME00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券