本文目錄一覽:
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得不到最大發揮。
C語言和python語言有很多相似嗎
一、語言類型不同C語言是比較古老的語言,並沒有太多高級語言的特性,在語言類型上他屬於編譯型語言,何為編譯型語言,編譯型語言就是經過了軟件的編譯後,生成機器碼,然後再由計算機操作系統去運行,他的優點就是執行速度很快,因為他是最接近計算機底層的語言,和計算機交互的時候,效率是很高的,他的缺點就是由於依賴底層的操作系統,所以並不能跨平台,無法做到一處代碼,處處編譯,他一般用於操作系統或者是驅動等底層的開發,是大學計算機的必修課。而Python或者Java這種屬於高級語言,Java是屬於解釋型語言,但是Python好像介於兩者之間,界限並不是劃分的特別明顯,但是他總體來說屬於解釋型語言,因為他有一個虛擬機,這個虛擬機就導致了Python可以跨平台,無論是哪個操作系統,只要你在有虛擬機的操作系統就可以運行Python代碼,所以Python跟適合做軟件的開發。二、數據類型的不同img src=”” data-caption=”” data-size=”normal” data-rawwidth=”554″ data-rawheight=”348″ data-default-watermark-src=”” class=”origin_image zh-lightbox-thumb” width=”554″ data-original=””/我們用一張圖概括了C語言的數據類類型、構造類型、指針類型、空類型,C語言在定義變量的時候一定要先聲明變量的類型,告訴計算機,我是一個什麼類型,然後計算機就會在內存中開闢對應的內存空間,我們以整型為例,計算機會在內存中開闢4個位元組的空間,這個空間主要用於初始化,由於在一開始我們就制定了長度,所以我們在運算的時候需要格外小心,需要考慮到內存是否夠用等溢出問題。img src=”” data-caption=”” data-size=”normal” data-rawwidth=”553″ data-rawheight=”243″ data-default-watermark-src=”” class=”origin_image zh-lightbox-thumb” width=”553″ data-original=””/我們再來看看Python的數據類型,可以發現大體上沒有太大的區別,,Python封裝了一些高級的數據類型,比如元組、字典等,Python對比C語言最大的優勢在於定義變量的時候不需要事先聲明變量的類型,比如我們定義一個整型變量age=18,首先計算機會是在內存中開闢一塊內存來存儲18,然後將age指向18,變量age是沒有類型之分的,這樣做的就比較友好了,我們不需要考慮變量的類型,也就無需考慮在運算過程中是否會溢出的問題。三、便利性的不同Python語言之所能夠火出圈,最大的原因還是因為他簡單,Python語言簡便的語法和豐富的類庫讓很多零基礎的小白感受到了開發的魔力,Python有很多很強大的內置函數,我們只需要在需要用到的時候import,這些豐富的類庫在Python中稱為模塊,像OS模塊、time模塊、random模塊等基礎模塊,我們可以使用一行甚至幾行代碼就可以實現C語言幾百行的效果。而Python這麼多模塊之間也有弊端,那就是模塊之間的引用問題,會出現各種報錯,一般管理模塊之間的關係我們可以使用pip來便捷管理。反觀C語言,他由於出生的時間比較早,沒有強大的類庫,導致我們很多的時候很多基礎類庫需要自己寫,我們在學習C語言的時候還記得需要引用很長一串頭文件,這些原因都是制約C語言發展的原因。不過C語言的這個特性可以讓開發者開發出更適合性能更高的一些內置函數。四、編程思維的不同C語言和Python另一個本質的區別就是編程的思維不同,簡單來說就是C語言是面向過程的語言,而Python是面向對象的語言。面向過程強調的是我該怎麼去做。即功能的執行過程,即先幹啥,後幹啥。在面向過程中,我們會寫很多的函數,每一個函數負責完成某一個功能,而向過程的設計思想存在以下幾個缺陷:系統軟件適應性差,可拓展性差,維護性低。img src=”” data-caption=”” data-size=”normal” data-rawwidth=”283″ data-rawheight=”104″ data-default-watermark-src=”” class=”content_image” width=”283″/面向對象的一種思維方式是對面向過程的一種改進,作為新式的編程思想,是站在對象的角度思考問題,我們把多個功能合理的放到不同對象里,強調的是我該讓誰來做。想吃飯讓阿姨做,想寫代碼僱傭程序員,不需要自己手動去做。面向對象最小的程序單元是類,必須先存在類的定義,再有對象,而具備某種功能的實體,稱為對象。img src=”” data-caption=”” data-size=”normal” data-rawwidth=”583″ data-rawheight=”328″ data-default-watermark-src=”” class=”origin_image zh-lightbox-thumb” width=”583″ data-original=””/面向過程和面向對象各有千秋,面向對象更符合我們常規的思維方式,穩定性好,可重用性強,易於開發大型軟件產品,有良好的可維護性,他有三大特徵:繼承、封裝、多態。五、其他的不同Python和C還有其他的不同,主要體現在開發的舒適度,在學習Python的時候,我們可以使用Python自帶的圖形化界面來編程,有點類似Linux的界面,這種界面交互性良好,使用簡單的命令就可以進入和退出,進一步降低了學習成本,而C語言的編譯器屈指可數,最開始使用的是Dev-C++這種交互性極差,UI極具年代感的產品,接着是微軟的Microsoft Visual studio雖然在功能和交互上進行了升級,但是還是感覺有年代感,不如Python那麼智能。說到Python就不得不提PyCharm,這種交互性極好UI美觀的產品真的是會讓人愛上編程,雖然他很吃內存,但是我們也可以使用VsCode這種輕量級的產品。此外,Python通過縮進來表示語句,減少了不必要的代碼,提高了可讀性和舒適度,讓代碼看起來更加美觀,而C語言是使用{},這些小的語法的區別都彰顯了Python語言的高級特性。總結以上說了那麼多Python和C的不同,總結來說就是C語言是很基礎的語言,就好比我們在小學的時候學習的加減乘除,是為以後學習解一元二次方程、橢圓方程等高級題目做準備的,學C語言也一樣,是基礎,是我們入門編程的第一課,讓我們體會到什麼是變量、什麼是方法、函數,所以我認為C語言更適合做入門的語言。img src=”” data-caption=”” data-size=”normal” data-rawwidth=”554″ data-rawheight=”350″ data-default-watermark-src=”” class=”origin_image zh-lightbox-thumb” width=”554″ data-original=””/而Python作為高級語言,吸收了C語言的一些好的地方,同時改進了C語言的不足,取其精華去其糟粕,所以讓Python變得更加智能,雖然代碼量少了,更簡單了,但是程序員不是工具人,是魔術師,我們需要去了解底層才能讓我們走的更遠更高。
python是c語言開發的嗎
python是c語言開發的嗎?
python是c語言開發的。
Python是完全面向對象的語言。函數、模塊、數字、字符串都是對象。並且完全支持繼承、重載、派生、多重繼承,有益於增強源代碼的復用性。Python支持重載運算符,因此Python也支持泛型設計。相對於Lisp這種傳統的函數式編程語言,Python對函數式編程只提供了有限的支持。有兩個標準庫(functools, itertools)提供了與Haskell和Standard ML中類似的函數式程序設計工具。
雖然Python可能被粗略地分類為「腳本語言」,但實際上一些大規模軟件開發計劃例如Zope、Mnet及BitTorrent,Google也廣泛地使用它。Python的支持者較喜歡稱它為一種高端動態編程語言,原因是「腳本語言」泛指僅作簡單程序設計任務的語言,如shell script、VBScript等只能處理簡單任務的編程語言,並不能與Python相提並論。
Python本身被設計為可擴展的。並非所有的特性和功能都集成到語言核心。Python提供了豐富的API和工具,以便程序員能夠輕鬆地使用C、C++、Cython來編寫擴展模塊。Python編譯器本身也可以被集成到其它需要腳本語言的程序內。因此,有很多人把Python作為一種「膠水語言」使用。使用Python將其他語言編寫的程序進行集成和封裝。
在Google內部的很多項目,例如Google應用服務引擎使用C++編寫性能要求極高的部分,然後用Python或Java/Go調用相應的模塊。[6]《Python技術手冊》的作者馬特利(Alex Martelp)說:「這很難講,不過,2004年,Python已在Google內部使用,Google召募許多Python高手,但在這之前就已決定使用Python。他們的目的是盡量使用Python,在不得已時改用C++;在操控硬件的場合使用C++,在快速開發時候使用Python。」
Python的設計哲學是「優雅」、「明確」、「簡單」。Python開發者的哲學是「用一種方法,最好是只有一種方法來做一件事」,也因此它和擁有明顯個人風格的其他語言很不一樣。在設計Python語言時,如果面臨多種選擇,Python開發者一般會拒絕花俏的語法,而選擇明確沒有或者很少有歧義的語法。這些準則被稱為「Python格言」。在Python解釋器內運行import this可以獲得完整的列表。
相關推薦:《Python教程》以上就是小編分享的關於python是c語言開發的嗎的詳細內容希望對大家有所幫助,更多有關python教程請關注環球青藤其它相關文章!
如何用Python封裝C語言的字符串處理函數
在C語言中,字符串處理是每天都要面對的問題。我們都知道C語言中其實並沒有一種原生的字符串類型,『字符串』在C語言里只是一種特殊的以”結尾的字符數組。因此,如何將C語言與更高層次的Python語言在『字符串』處理這個問題上對接是一個有難度的問題。所幸有swig這種強大的工具。
如何封裝一個函數,它修改參數字符串的內容
假如有這樣一個C語言的函數,
!– lang: cpp —
void FillZero(char* pc,size_t * piLen)
{
size_t i=0;
while(i++*piLen/2 )
*pc++ = ‘0’;
*pc = 0;
*piLen = i+1;
}
這個函數的功能是把字符串變成n個0。不過我們更關注函數的形式。這樣的函數,表面上看char* pc是函數的參數,可是實際上它才是函數的返回值和執行的結果。piLen這個參數既是pc的最大長度,也是新的字符串的長度。我們直接用python封裝,看看運行結果。
Type “help”, “copyright”, “credits” or “license” for more information.
import cchar
s=’123456′
cchar.FillZero(s,6)
Traceback (most recent call last):
File “stdin”, line 1, in module
TypeError: in method ‘FillZero’, argument 2 of type ‘size_t *’
結果差強人意,不是我們想要得到的結果。函數的第二個參數為size_t* 我們很難用python來表示,而且python中也不存在既是輸入,也是輸出的參數。
swig有一個標準庫,其中有一個cstring.i文件就是用來解決C語言字符串類型的問題。
我們在.i文件中加入這樣幾行
!– lang: cpp —
%include “cstring.i”
%cstring_output_withsize(char* pc,size_t* pi)
void FillZero(char* pc, size_t* pi);
然後運行看結果
Type “help”, “copyright”, “credits” or “license” for more information.
import cchar
cchar.FillZero(10)
‘00000\x00’
s=cchar.FillZero(10)
print s
00000
我們看函數的變化。首先在python里, FillZero變成了只有一個參數的函數。然後函數的返回值變成了一個字符串。其實cstring_output_size其實是一個宏,通過這個宏的定義改變了函數的形式,直接在Python中得到我們想要的結果。
其實類似cstring_output_size的宏還有好幾個,我列舉一下:
cstring_output_allocate(char *s,free($1));
第一個參數是指向字符串地址的指針,第二個參數為釋放空間的方法。
大家考慮這一下這樣的函數:
void foo(char* s)
{
s = (char*)malloc(10);
memcpy(s,”123456789″,9);
}
s這個參數表面上看是輸入,實際上是函數真正的輸出。 函數中真正改變的東西是chars指向的字符串的值。而且char這個類型,
python或者其他腳本語言里應該都沒有對應的類型。那麼我們用cstring_output_allocate將這個函數轉換成另外一個形式的python或者其他腳本語言的函數。轉換後的函數其實是這樣的,以python為例str
foo()。
!– lang: cpp —
%module a
%include “cstring.i”
%{
void foo(char* s);
%}
%cstring_output_allocate(char *s, free(*$1));
void foo(char *s);
在python中的調用:
!– lang: python —
import a
a.foo()
‘123456789’
cstring_output_maxsize(char *path, int maxpath);
第一個參數也是可以改變的字符串首地址,第二個參數為字符串的最大長度。在Python中調用的時候,只有maxpath這個參數,返回字符串。
cstring_output_allocate(char *s, free($1));
第一個參數為指向字符串首地址的指針,第二個參數為釋放指針的方法。這個宏主要是封裝一種直接在函數內部malloc空間的函數。在Python中調用時沒有參數,直接返回字符串。
cstring_output_allocate_size(char *s, int slen, free(*$1));
這個相當於前面兩個函數的組合。在函數內部malloc空間,然後將字符串長度通過slen返回。其實在調用的時候非常簡單,沒有參數,直接返回字符串。
如何處理c++的std::string
std::string是C++標準類庫STL中常見的類。在平時工作中大家肯定是沒少用。在python中如何封裝std::string? swig提供了標準庫
例如函數:
!– lang: cpp —
string Repeat(const string s)
{
return s+s;
}
只要在swig中加入這樣幾行:
!– lang: cpp —
%include “std_string.i”
using namespace std;
string Repeat(const string s);
運行結果:
Python 2.6.6 (r266:84292, Dec 27 2010, 00:02:40)
[GCC 4.4.5] on linux2
Type “help”, “copyright”, “credits” or “license” for more information.
import cchar
cchar.Repeat(‘123’)
‘123123’
使用起來很方便,但需要注意的是,假如函數的參數的內容是可以被修改,就不能用這種方式封裝。
例如:
!– lang: cpp —
void repeat(string s)
{
s+=s;
}
這樣的函數直接使用 ‘std_string.i’ 就是無效的。遇到這種函數,只能用C語言封裝成 void repeat(chars, int maxsize), 再用swig調用 ‘cstring_output_withsize’ 這個宏再封裝一次了。
c語言包裝python程序
_popen 不能把exe的輸入傳給python的輸入的,只能給python傳參。且視系統的安全設置,當賬號的權限不夠會導致調用失敗。
如果要做到EXE與py的互相調用 就用動態鏈接庫實現。
下面提供簡單的例子,這關字數有限制,更詳細的請GOOGLE
python調用C/C++:
import ctypes
dll = ctypes.windll.LoadLibrary( ‘test.dll’ )
dll.test();
C/C++調用python
#include Akita/Akita.h
#include Python.h
int main() {
Py_Initialize();
if (!Py_IsInitialized()) return FALSE;
PyRun_SimpleString(”import sys”);
PyRun_SimpleString(”sys.path.append(””./””)”);
//import Module
PyObject* pModule = PyImport_ImportModule(”hello”);
if (!pModule) {
cout”Can””t import Module!/n”endl;
return -1;
}
PyObject* pDict = PyModule_GetDict(pModule);
if (!pDict) {
return -1;
}
//fetch Function
PyObject* pFunHi = PyDict_GetItemString(pDict, “display”);
PyObject_CallFunction(pFunHi, “s”, “Crazybaby”);
Py_DECREF(pFunHi);
//Release
Py_DECREF(pModule);
Py_Finalize();
return 0;
}
Akita/Akita.h,Python.h這兩個文件請上網下載。
原創文章,作者:OGCM,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/139673.html
微信掃一掃
支付寶掃一掃