首页 > 编程 > Python > 正文

浅谈Python程序与C++程序的联合使用

2020-02-23 00:34:30
字体:
来源:转载
供稿:网友

作为Python程序员,应该能够正视Python的优点与缺点。众所周之,Python的运行速度是很慢的,特别是大数据量的运算时,Python会慢得让人难以忍受。对于这种情况,“专业”的解决方案是用上numpy或者opencl。不过有时候为了一点小功能用上这种重型的解决方案很不划算,或者有时候想要实现的操作在numpy里面没有,需要我们自己用C语言来编写。总之,我们使用Python与C++的混合编程能够加快程序热点的运算速度。

首先要提醒大家注意的是,在考虑联合编程之前一定要找到程序运行的热点。简单一点地,使用标准库的profile或者cProfile模块找到最消耗CPU的位置,如果这个位置只简单的消耗IO时间,通常换成C++程序的意义也不会很大,此时做联合编程可能是事倍功半,起不到多大的效果。

还有些情况,Python程序员们想要使用操作系统或者外部模块提供的函数。这些模块一般是为C/C++程序员提供的。这时候也是Python与C++联合编程的用武之地。

Python语言可以说是最好的胶水语言。仅就与C++联合编程这个问题来讲,依使用难度与功能来排列,Python社区提供了以下几种解决方案:

1.使用标准库ctypes直接调用C/C++编写的动态链接库。这是最简单易用的方案。C/C++程序员使用自己的丰富的经验,把预定的功能实现为动态链接库。而Python程序员只要知道这些动态链接库函数的名称、参数类型与返回值类型就能简单地调用它。当你传入参数时,ctypes模块会自动地把Python的对象成为C/C++所对应的参数类型。比如以下调用Windows的API:

  #定义参数类型与函数名称  from ctypes.wintypes import UINT, DWORD  GetLastInputInfo = ctypes.windll.user32.GetLastInputInfo  class LASTINPUTINFO(ctypes.Structure):    _fields_ = [("cbSize", UINT),         ("dwTime", DWORD)]  #开始调用DLL导出的函数  def getLastInputTime_nt():    info = LASTINPUTINFO()    info.cbSize = ctypes.sizeof(info)    info.dwTime = 0    if not GetLastInputInfo(ctypes.byref(info)):      raise WindowsError("")    return info.dwTime

    在这里展示了如何构造Windows的API所需要的结构体,如何填充结构体并分析返回值。

    ctypes还能将Python函数提供给C/C++代码作为回调函数。

    与其它解决方案相比。ctypes不需要程序员熟悉C/C++语言,不需要安装一个C/C++的编译器,它通过操作系统的接口直接操作C/C++代码。而且ctypes是标准库的一部分,只要安装了Python就可以直接使用。这几个原因使得它深受Python程序员的喜爱。

    而它的劣势呢。首先,ctypes不能简单调用C++程序,因为C++在编译的时候使用了name mangling这个技术来实现函数的重载。C++会自动地为类的成员函数加上类名前缀。所以,C++程序员需要以C语言的调用约定来提供接口,没有类,没有重载函数,没有模板,没有C++异常。不能直接调用现有的C++代码可能是这个方案最大的缺点。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表