Python是一種動態類型,解釋性的語言,對於許多開發者來說,Python運行慢是眾所周知的事情,其萬物皆對象的特性,就是導致其運行慢的一個原因,下面將從三個面向來分析Python慢的原因。
動態類型
#Python是動態類型而不是靜態類型的,這意味著,在程式執行時,解釋器並不知道變數的類型。對C語言來說,編譯器在宣告變數的時候就知道其類型了;對Python來說,程式執行時只知道一個變數是某種Python物件。
對於下面的C程式碼
int a = 1; int b = 2; int c = a + b;
編譯器總是知道a和b是整數型,在執行相加運算時,流程如下:
把
把
#呼叫binary_add
#把結果賦值給c
#實現同樣功能的Python程式碼如下:
a = 1 b = 2 c = a + b
相關推薦:《Python影片教學》
解釋器只知道1和2是對象,但不知道這個物件的類型。所以解釋器必須檢查每個變數的PyObject_HEAD才能知道變數類型,然後執行對應的相加操作,最後要建立一個新的Python物件來保存回傳值,大致流程如下:
第一步,把1賦值給a
1.設定a->PyObject_HEAD->typecode為整數
2.設定a->val = 1
#第二步,把2賦值給b
1.設定a->PyObject_HEAD->typecode為整數
2.設定b->val = 2
第三步,呼叫binary_add
1.a->PyObject_HEAD取得型別編碼
2.a是一個整數型;值為a ->val
3.b->PyObject_HEAD取得型別編碼
4.b是整數型,值為b->val
##5.調用binary_add1.設c->PyObject_HEAD->typecode為整數#2.設定c->val為result動態類型意味著任何操作都會涉及更多的步驟。這是Python對數值操作比C語言慢的主要原因
Python是解釋型語言
上面介紹了解釋型程式碼和編譯型程式碼的一個差異。智慧的編譯器可以提前預見並最佳化重複或不必要的操作,這會帶來效能的提升。編譯器是一個大的話題,這裡不會展開。Python的物件模型會帶來低效率的記憶體存取
和C語言的整數對比時,我們指出了Python多了額外一層資訊。現在來看看數組的狀況。在Python中我們可以使用標準函式庫中提供的List物件;而在C語言中我們會使用基於緩衝區的陣列。 最簡單的NumPy數組是圍繞著C資料建構的Python對象,也就是說它有一個指向連續資料快取區的指標。而Python的list具有指向連續的指針緩衝區的指針,這些指針每個都指向一個Python對象,結合上面的例子,這些Python對像是一個整數對象。這個結構像下面這樣很容易看出,如果你正在執行按順序逐步完成資料的操作,numpy的記憶體佈局比Python的記憶體佈局更為高效,無論是儲存成本還是存取的時間成本。以上是為什麼python慢的詳細內容。更多資訊請關注PHP中文網其他相關文章!