當前位置:首頁 » 編程語言 » pythonc擴展

pythonc擴展

發布時間: 2022-08-19 04:34:54

python的字典怎麼擴展成C呢拿什麼數據結構接收100分 詳細進來~

1、直接用PyObject。上策
2、轉換成C++ STL的Map容器是直接對應的。中策
3、使用的是數據,而不是結構,只要能讓中間的數據發揮作用,就沒必要一樣的結構,也就是轉換成具體適合你那接下來C中應用的結構。比如只用到某幾個鍵和某幾個值。如果C中根本不應用,就回到1。中策
4、自己在C中實現這種字典。建立散列表或者紅黑樹表。或者最簡單的兩個一維數組,實現key[],value[]的一一對應。下策

② python編譯C擴展報錯

C和Python介面的地方應該沒什麼泄露。
關鍵是你現在是用C,那所有內存分配的地方都有可能泄露唄。 實在不行可以Jython,或者上面提到的Cython

③ python的c擴展可以包含多個mole嗎

用__init__.py

④ 如何用wintc編譯Python的c擴展

python
setup.py
build
--compiler=mingw32
執行後會在當前目錄生成一個build目錄及文件:
build\lib.win32-2.6\add.pyd
將add.pyd拷貝到當前目錄,並寫一個測試文件test.py,代碼如下:
import
add
print
add.add(3,4)
執行一下,輸出為7
OK,基本上就是如此了。

⑤ Python為什麼能擴展

Python 具有高可擴展性,存在許多使用 C 語言或 Fortran 編寫擴展的方法。必要時,Python 代碼可以直接將這些擴展作為子常式來調用。這部分討論用於構建擴展的一些主要編譯器(絕對不是完整列表)。

相關推薦:《Python基礎教程》

Cython

Cython(不同於 CPython)既是指一種語言,也是指一種編譯器。Cython 語言是添加了 C 語言語法的 Python 語言的超集。Cython 可以在代碼段或完整函數中顯式釋放 GIL。變數和類屬性上的 C 類型聲明以及對 C 函數的調用都使用 C 語法。其餘部分代碼則使用 Python 語法。通過這個混合的 Cython 代碼,Cython 編譯器可生成高效的 C 代碼。任何定期優化的 C/C++ 編譯器都可以編譯此 C 代碼,從而高度優化擴展的運行時代碼,性能接近於原生的 C 代碼性能。

Numba

Numba 是一個動態、即時 (JIT) 且可感知 NumPy 的 Python 編譯器。Numba 使用 LLVM 編譯器基礎架構,生成優化的機器代碼和從 Python 調用代碼的包裝器。與 Cython 不同,編碼使用常規的 Python 語言。Numba 可讀取來自裝飾器中所嵌入注釋的類型信息,並優化代碼。對於使用 NumPy 數據結構的程序,比如數組以及許多數學函數,它可以實現與 C 或 Fortran 語言類似的性能。NumPy 對線性代數和矩陣函數使用硬體加速,利用 LAPACK 和 BLAS 提供額外加速,大大提升了性能,參見 IBM 博客文章C、Julia、Python、Numba 和 Cython 在 LU 因式分解方面的速度比較。

除 CPU 以外,Numba 還能夠使用 GP-GPU 後端。Anaconda, Inc. 是 Python 某個主要發行版的幕後公司,該公司還開發了 Numba 和商業版的 Numba Pro。

Fortran to Python Interface Generator

Fortran to Python Interface Generator (F2Py) 起初為一個獨立的程序包,現在包含在 NumPy 中。F2Py 支持 Python 調用以 Fortran 編寫的數值常式,就好像它們是另一個 Python 模塊一樣。因為 Python 解釋器無法理解 Fortran 源代碼,所以 F2Py 以動態庫文件格式將 Fortran 編譯為本機代碼,這是一種共享對象,包含具有 Python 模塊介面的函數。因此,Python 可以直接將這些函數作為子常式來調用,以原生 Fortran 代碼的速度和性能來執行。

⑥ 如何建立我的C擴展使用MinGW-W64在Python

安裝Python的 windows擴展模塊時發生Unable to find vcvarsall.bat的錯誤,解決方法如下: 首先安裝MinGW,在MinGW的安裝目錄下找到bin的文件夾,找到mingw32-make.exe,復制一份更名為make.exe; 把MinGW的路徑添加到環境變數path中,

⑦ Python的c語言擴展

C-Python,或者CPython,指C實現的Python虛擬機的基礎API。最通用的Python就是是基於C實現的,它的底層API稱為C-Python
API,所有Python代碼的最終變成這些API以及數據結構的調用,才有了Python世界的精彩。
Cython,准確說Cython是單獨的一門語言,專門用來寫在Python裡面import用的擴展庫。實際上Cython的語法基本上跟Python一致,而Cython有專門的「編譯器」先將
Cython代碼轉變成C(自動加入了一大堆的C-Python
API),然後使用C編譯器編譯出最終的Python可調用的模塊。
GIL:Global
Interpreter
Lock,是Python虛擬機的多線程機制的核心機制,翻譯為:全局解釋器鎖。其實Python線程是操作系統級別的線程,在不同平台有不同的底層實現(如win下就用win32_thread,
posix下就用pthread等),Python解釋器為了使所有對象的操作是線程安全的,使用了一個全局鎖(GIL)來同步所有的線程,所以造成「一個時刻只有一個Python線程運行」的偽線程假象。GIL是個顆粒度很大的鎖,它的實現跟性能問題多年來也引起過爭議,但到今天它還是經受起了考驗,即使它讓Python在多核平台下CPU得不到最大發揮。

⑧ python擴展的c代碼在哪裡寫

在哪裡寫都可以啊,重要的是編譯過程。給你介紹下編譯過程吧。



在windows和linux下面,對C擴展的編譯方法是不一樣的,我們先來看windows版的。


我們用C實現一個簡單的加法。
首先新建一個文件add.c,代碼如下:

#include<Python.h>;
staticPyObject*add(PyObject*self,PyObject*args);
//一定聲明為static,把他們限制在這個文件范圍里。幾乎所有的參數都是PyObject類型,在python,每個東西都是object。
staticPyObject*add(PyObject*self,PyObject*args)
{
intx=0;
inty=0;
intz=0;
if(!PyArg_ParseTuple(args,"i|i",&x,&y))
returnNULL;
/*第一個參數是self,這個是python用的,每個函數都要有。我們暫時不管。args是一個參數列表。她把所有的參數都整合成一個string。所以
我們需要從這個string里來解析我們的參數。PyArg_ParseTuple來完成這個任務。第一個參數是args,就是我們要轉換的參數。第二個是格式符號。
「s」代表是個string。從args里提取一個參數就寫"s",兩個的話就寫"s|s",如果是一個string,一個int,就寫"s|i",和printf差不多。第三個
參數就是提取出來的參數放置的真正位置。必須傳遞這個參數的地址。對於add,他將提取兩個參數。分別是x和y。*/
z=x+y;
returnPy_BuildValue("i",z);
/*調用完之後我們需要返回結果。這個結果是c的type或者是我們自己定義的類型。必須把他轉換成PyObject,讓python認識。這個用Py_BuildValue
來完成。他是PyArg_ParseTuple的逆過程。他的第一個參數和PyArg_ParseTuple的第二個參數一樣,是個格式化符號。第三個參數
是我們需要轉換的參數。Py_BuildValue會把所有的返回只組裝成一個tutple給python。*/
}
staticPyMethodDefaddMethods[]=
{
{"add",add,METH_VARARGS,"Executeashellcommand."},
{NULL,NULL,0,NULL}
};
/*這個是一個c的結構。他來完成一個映射。我們需要把我們擴展的函數都映射到這個表裡。表的第一個欄位是python真正認識的。是python里的方法名字。第二個欄位是python里的這個方法名字的具體實現的函數名。在python里調用add,真正執行的是用c寫的add函數。第三個欄位是METH_VARARGS,他告訴python,add是調用c函數來實現的。第四個欄位是這個函數的說明。如果你在python里來help這個函數,將顯示這個說明。相當於在python里的函數的文檔說明。*/
PyMODINIT_FUNCinitadd()
{
Py_InitMole("add",addMethods);
}
/*注意,這個函數的名字不能改動。必須是init+模塊名字。我們的模塊名字是add。所以這個函數是initadd()。
這樣python在導入add的模塊時候,才會找到這個函數,並調用。這個函數調用Py_InitMole來將模塊名字和映射表結合在一起。他表示,add這個模塊使用addMethods這個映射表。python應該這樣導入我們的mole的.*/

新建一個setup.py,內容如下:

fromdistutils.coreimportsetup,Extension
mole1=Extension('add',sources=['add.c'])
setup(name='PackageName',version='1.0',description='Thisisademopackage',ext_moles=[mole1])

組建:(由於我的機器上裝了mingw,所以指定了mingw32。默認的編譯器是vs2008。參考:

python setup.py build--compiler=mingw32

執行後會在當前目錄生成一個build目錄及文件:

buildlib.win32-2.6add.pyd

將add.pyd拷貝到當前目錄,並寫一個測試文件test.py,代碼如下:

import add
print add.add(3,4)

執行一下,輸出為7

OK,基本上就是如此了。

在linux下的話,會有少許不同.
即直接用makefile將add.c編譯成.so,python可以直接import,makefile代碼如下:

PYLIB=/usr/bin
PYINC=/usr/include/python2.6
all:add.c
gccadd.c-g-I$(PYINC)-shared-L$(PYLIB)-lpython2.6-oadd.so
clean:
rm-fadd.so

用同樣的測試代碼,可以測試通過。

⑨ 求,Python的C擴展程序中傳遞參數為結構體,怎麼傳遞

況如下:
打算從python發一個tcp數據包給遠程伺服器,數據的主體是一個c語言的
struct
(較大,size
為1402)。由於這個struct太復雜,故不打算在python
處對其重新定義,目前的想法是用python調用一個c語言的模塊,在這個模塊中定義這個struct,並設置好數據後,將其struct傳回python中,再打包傳送伺服器。
但是不知道如何將這個struct
變數從c語言
傳入python中。嘗試用py_buildvalue函數,以py_buildvalue("p",&interface_setup)
//interface_setup為結構體變數
傳遞,
但是幾次都得到運行時錯誤:
systemerror:
bad
format
char
passed
to
pybuildvaule。

⑩ python 可擴展主要體現

就算你的項目中有大量的Python代碼,你也依舊可以有條不紊地通過將其分離為多個文件或模塊加以組織管理。而且你可以從一個模塊中選取代碼,而從另一個模塊中讀取屬性。更棒的是,對於所有模塊,Python的訪問語法都是相同的。不管這個模塊是Python標准庫中的還是你一分鍾之前創造的,哪怕是你用其他語言寫的擴展都沒問題!藉助這些特點,你會感覺自己根據需要「擴展」了這門語言,而且你已經這么做了。
代碼中的瓶頸,可能是在性能分析中總排在前面的那些熱門或者一些特別強調性能的地方,可以作為Python擴展用C重寫。需要重申的是,這些介面和純Python模塊的介面是一模一樣的,乃至代碼和對象的訪問方法也是如出一轍的。唯一不同的是,這些代碼為性能帶來了顯著的提升。自然,這全部取決你的應用程序以及它對資源的需求情況。很多時候,使用編譯型代碼重寫程序的瓶頸部分絕對是益處多多的,因為它能明顯提升整體性能。
程序設計語言中的這種可擴展性使得工程師能夠靈活附加或定製工具,縮短開發周期。雖然像C、C++乃至Java等主流第三代語言(3GL)都擁有該特性,但是這么容易地使用C編寫擴展確實是Python的優勢。此外,還有像PyRex這樣的工具,允許C和Python混合編程,使編寫擴展更加輕而易舉,因為它會把所有的代碼都轉換成C語言代碼。
因為Python的標准實現是使用C語言完成的(也就是CPython),所以要使用C和C++編寫Python擴展。Python 的Java實現被稱作Jython,要使用Java編寫其擴展。最後,還有IronPython,這是針對.NET或Mono平台的C#實現。你可以使用C#或者VB.Net擴展IronPython.

熱點內容
銳程cc尊貴版都有哪些配置 發布:2025-01-19 18:27:08 瀏覽:977
php手機網站 發布:2025-01-19 18:26:34 瀏覽:456
一加存儲路徑 發布:2025-01-19 18:21:01 瀏覽:446
sqlserver誤刪 發布:2025-01-19 18:21:00 瀏覽:649
球球安全中心動態密碼在哪裡 發布:2025-01-19 18:20:23 瀏覽:790
python讀取config文件 發布:2025-01-19 18:15:10 瀏覽:458
android生成so 發布:2025-01-19 18:14:33 瀏覽:697
比亞迪漢ev家用哪個配置值得 發布:2025-01-19 18:08:02 瀏覽:382
aspnet批量上傳文件 發布:2025-01-19 17:59:36 瀏覽:395
攻擊伺服器ip會不會判刑 發布:2025-01-19 17:59:28 瀏覽:32