最新的PyPy很好地支持Python C扩展

Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

PyPy最新版本5.6,Python的一个即时编译的运行时,提供常见错误修复列表并不断改进。它最大的变化,包含PyPy的C扩展这个长期问题和使用它们的主要Python包。

Python语言从来不是运行最快的语言,但是用C语言重写高性能函数可以让Python应用程序和纯C语言的性能的距离近在咫尺,通常没有完全用C语言编写应用程序的麻烦。

[InfoWorld评论:6款Python IDE大比拼。 | 13款顶级Python web框架。| 让Python更快的10个核心编码技巧。| 跟上InfoWorld应用程序开发实时简讯中有关编程的热门话题。]

PyPy通过编译Python应用程序来加速它们,但是这种做法的一个缺点是Python应用中的C扩展不能很好工作。更重要的是,很多有用的Python包使用C扩展,而它们不能到处运行。

Python的C语言API解决方法是使用一个兼容层CPyExt,它更改并更新到PyPy5.6。CPyExt广泛应用数学和统计包NumPy,它是一个大项目需要C扩展的范例,虽然它仍然不能运行Pandas(另外一个使用广泛的面向数学的包)。

坏消息:CPyExt是一个封装层,因此任何调用通过它都会更慢。PyPy给开发者提供两种解决方案:使用纯Python编程并使用PyPy加速,或者使用CFFI——一个集成在PyPy的C接口。

第一个方案对于不严重依赖于C语言功能或速度的程序来说是好的。一些Python应用程序提供使用C模块加速的能力(通过工具如Cython编译),但是如果C模块不能工作,可以降低到纯Python的速度。如在NumPy工程,它可能不工作。

后一种使用CFFI的方案也有问题。CFFI使用更多“Python式”与C语言一起工作而不是Python的ctype接口,而且两者不可互换。目前的Python包与C的接口采用标准方式,为了PyPy兼容性不可能用CFFI重写。

由于NumPy被广泛使用,并且对于PyPy用户来说它是最大的障碍之一,PyPy的开发者fork NumPy并且创建一个PyPy兼容的版本叫做NumPyPy。 考虑这一例外,而不是规则——你需要大量的人手来创建PyPy兼容fork,即使包的一小部分依赖C扩展。

对于PyPy用户来说哪个版本将胜出:NumPy还是NumPyPy?据开发人员所说,两者都有优点:“有些地方gcc可以击败JIT,而有些地方NumPyPy和PyPy紧密集成性能更高”开发者Richard Plangger在PyPy博客中声明道。与其增强一个,PyPy计划“整合[NumPy和NumPyPy],操纵C扩展方法调用使用NumPyPy,因为NumPyPy会更快。”

评论本文和InfoWorld的其它内容,请访问InfoWorld的领英FacebookTwitter

英文原文:http://www.infoworld.com/article/3143126/application-development/pypy-update-makes-nice-with-python-c-extensions.html
译者:毛茸茸的向日葵
 

2月15日11:00到13:00网站停机维护,13:00前恢复
iPy智能助手 双击展开
查看更多聊天记录
(Ctrl+回车)换行