日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python c 混合编程 用c循环_混合编程:用 C 语言来扩展 Python 大法吧!

發(fā)布時(shí)間:2024/9/19 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python c 混合编程 用c循环_混合编程:用 C 语言来扩展 Python 大法吧! 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Python 實(shí)在是一種讓人上癮的編程語(yǔ)言,簡(jiǎn)潔的語(yǔ)法+豐富的擴(kuò)展包,幾乎可以用 Python 做任何事情,唯一的黑點(diǎn)似乎就是「慢」,但是與高效的編譯語(yǔ)言 C\C++ 互聯(lián)以后,可以解決腳本語(yǔ)言運(yùn)行速度慢的問(wèn)題,甚至用來(lái)做一些計(jì)算密集型的工作,比如 CFD。

這一篇介紹純 C 語(yǔ)言擴(kuò)展 Python。

為什么是swig?

Python底層就是 C\C++,有原生的 C\C++ 接口,用來(lái)傳遞變量,但是完全手寫(xiě)中間層對(duì)于我這樣的業(yè)余 Coder 實(shí)在太痛苦了,這不是一件很有意思的工作。事實(shí)上,即使在Python的官方文檔里也推薦用第三方的接口工具處理。

Third party tools like Cython, cffi, SWIG and Numba offer both simpler and more sophisticated approaches to creating C and C++ extensions for Python.

除了以上的第三方工具外,還有 sip,Boost.python,pyrex等好用的工具,在這篇 文章 里初步介紹了 C\C++ 擴(kuò)展Python的各種方法。

之前用過(guò)Boost.python,可能是我之前沒(méi)接觸過(guò)Boost吧,不是很喜歡,感覺(jué)不夠輕量級(jí),然后對(duì)swig一見(jiàn)傾心的原因是其對(duì)于純 C 的良好支持(當(dāng)時(shí)寫(xiě)這篇文章的時(shí)候?qū)?C++ 莫名的反感,雖然現(xiàn)在已經(jīng)入了 C++ 的坑了)。

怎么安裝swig?

1.Mac OS

強(qiáng)烈建議用brew來(lái)裝

brew install swig

一條命令搞定,媽媽再也不用擔(dān)心你的依賴(lài)問(wèn)題了。

2.Windows

博主暫時(shí)脫離windows開(kāi)發(fā)環(huán)境一會(huì)兒,建議參考官方文檔

3.Linux

大名鼎鼎的apt-get install

怎么使用swig?

我參考了官方文檔里的一個(gè)示例程序,最終的目的是生成一個(gè)動(dòng)態(tài)鏈接庫(kù)和一個(gè)供調(diào)用的py文件。

聲明函數(shù)先

創(chuàng)建一個(gè)example.h頭文件來(lái)聲明這個(gè)函數(shù):

/*File: example.h*/

int fact(int n);

定義函數(shù)

創(chuàng)建一個(gè)example.c的文件(用來(lái)計(jì)算 n!):

/* File: example.c */

#include "example.h"

int fact(int n) {

if (n < 0){

/* This should probably return an error, but this is simpler */

return 0; }

else if (n == 0) {

return 1;

}

else {

/* testing for overflow would be a good idea here */

return n * fact(n-1);

}

}

關(guān)鍵一步

我們還需要?jiǎng)?chuàng)建一個(gè)example.i文件來(lái)配置swig:

/* File: example.i */

%module example

%{

#define SWIG_FILE_WITH_INIT

#include "example.h"

%}

int fact(int n);

簡(jiǎn)單解釋一下這個(gè)配置文件,#define SWIG_FILE_WITH_INIT宏規(guī)定這個(gè) C 文件將會(huì)被編譯成 Python 模塊,#include "example.h" 給出需要包含的頭文件,最后一句在example.i聲明了這個(gè)函數(shù),就是這么簡(jiǎn)單嘛。

有了這三個(gè)文件之后,我們需要先編譯出一個(gè) Python 文件,在終端運(yùn)行:

swig -python example.i

如果編譯的是C++文件,需要加上-C++選項(xiàng):

swig -c++ -python example.i

運(yùn)行完這個(gè)命令后,在工作目錄里會(huì)出現(xiàn)example_wrap.c或example.cxx以及一個(gè)example.py的Python文件,但是現(xiàn)在這個(gè)模塊還不能直接調(diào)用,因?yàn)檫€缺少動(dòng)態(tài)鏈接庫(kù),如果強(qiáng)行調(diào)用會(huì)出現(xiàn)這種錯(cuò)誤:

ImportError: No module named '_example'

接下來(lái)需要編譯出一個(gè)shared object file,在Linux平臺(tái)里是so文件,在windows下是Dll文件,有兩種方法完成這個(gè)步驟,官方文檔中推薦使用distutils,即Python的setup.py生成模塊:

"""

setup.py file for SWIG example

"""

from distutils.core import setup, Extension

example_module = Extension('_example',

sources=['example_wrap.c', 'example.c'],

)

setup(name = 'example',

version = '0.1',

author = "SWIG Docs",

description = """Simple swig example from docs""",

ext_modules = [example_module],

py_modules = ["example"],

)

然后在終端里輸入:

python setup.py build_ext --inplace

build_ext告訴Python需要編譯的是擴(kuò)展模塊,--inplace會(huì)確保編譯生成的文件放在當(dāng)前目錄中。

運(yùn)行完這個(gè)命令后,會(huì)在工作目錄出現(xiàn)一個(gè)so文件,這時(shí)example.py文件可以直接被Python調(diào)用:

10! = 362880

來(lái)自 Cescfangs 的博客:fangs.in

總結(jié)

以上是生活随笔為你收集整理的python c 混合编程 用c循环_混合编程:用 C 语言来扩展 Python 大法吧!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。