使用Python作为粘合剂

很多人都喜欢说Python是一种很棒的粘合语言。希望本章能说服你这是真的。Python的第一批科学家通常使用它来粘合在超级计算机上运行的大型应用程序代码。在Python中编写代码比在shell脚本或Perl中编写代码更好,此外,轻松扩展Python的能力使得创建专门适应所解决问题的新类和类型变得相对容易。从这些早期贡献者的交互中,Numeric出现了一个类似于数组的对象,可用于在这些应用程序之间传递数据。

随着Numeric的成熟和发展成为NumPy,人们已经能够在NumPy中直接编写更多代码。通常,此代码对于生产使用来说足够快,但仍有时需要访问已编译的代码。要么从算法中获得最后一点效率,要么更容易访问用C / C ++或Fortran编写的广泛可用的代码。

本章将回顾许多可用于访问以其他编译语言编写的代码的工具。有许多资源可供学习从Python调用其他编译库,本章的目的不是让你成为专家。主要目标是让您了解一些可能性,以便您知道“Google”的内容,以便了解更多信息。
从Python调用其他编译库

虽然Python是一种很好的语言并且很乐意编写代码,但它的动态特性会导致开销,从而导致一些代码( 即
for循环中的原始计算)比用静态编译语言编写的等效代码慢10-100倍。此外,由于在计算过程中创建和销毁临时数组,因此可能导致内存使用量大于必要值。对于许多类型的计算需求,通常不能节省额外的速度和内存消耗(至少对于代码的时间或内存关键部分而言)。因此,最常见的需求之一是从Python代码调用快速的机器代码例程(例如使用C / C ++或Fortran编译)。这相对容易做的事实是Python成为科学和工程编程的优秀高级语言的一个重要原因。

它们是调用编译代码的两种基本方法:编写扩展模块,然后使用import命令将其导入Python,或者使用ctypes

模块直接从Python调用共享库子例程。编写扩展模块是最常用的方法。

警告

如果你不小心,从Python调用C代码会导致Python崩溃。本章中没有一种方法可以免疫。您必须了解NumPy和正在使用的第三方库处理数据的方式。
手工生成的包装器

在编写扩展模块中讨论了扩展模块。与编译代码接口的最基本方法是编写扩展模块并构造调用编译代码的模块方法。为了提高可读性,您的方法应该利用 PyArg_ParseTuple 调用在Python对象和C数据类型之间进行转换。对于标准的C数据类型,可能已经有一个内置的转换器。对于其他人,您可能需要编写自己的转换器并使用"O&"格式字符串,该字符串允许您指定一个函数,该函数将用于执行从Python对象到所需的任何C结构的转换。

一旦执行了对适当的C结构和C数据类型的转换,包装器中的下一步就是调用底层函数。如果底层函数是C或C ++,这很简单。但是,为了调用Fortran代码,您必须熟悉如何使用编译器和平台从C / C ++调用Fortran子例程。这可能会有所不同的平台和编译器(这是f2py使接口Fortran代码的生活变得简单的另一个原因)但通常涉及下划线修改名称以及所有变量都通过引用传递的事实(即所有参数都是指针)。

手工生成的包装器的优点是您可以完全控制C库的使用和调用方式,从而可以实现精简且紧凑的界面,并且只需最少的开销。缺点是您必须编写,调试和维护C代码,尽管大多数代码都可以使用其他扩展模块中“剪切粘贴和修改”这种历史悠久的技术进行调整。因为,调用额外的C代码的过程是相当规范的,所以已经开发了代码生成过程以使这个过程更容易。其中一种代码生成技术与NumPy一起分发,可以轻松地与Fortran和(简单)C代码集成。这个软件包f2py将在下一节中简要介绍。

更多请见:http://www.mark-to-win.com/tutorial/52202.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值