為什麼python慢

爱喝马黛茶的安东尼
發布: 2019-06-25 16:07:50
原創
3005 人瀏覽過

Python是一種動態類型,解釋性的語言,對於許多開發者來說,Python運行慢是眾所周知的事情,其萬物皆對象的特性,就是導致其運行慢的一個原因,下面將從三個面向來分析Python慢​​的原因。

為什麼python慢

動態類型

#Python是動態類型而不是靜態類型的,這意味著,在程式執行時,解釋器並不知道變數的類型。對C語言來說,編譯器在宣告變數的時候就知道其類型了;對Python來說,程式執行時只知道一個變數是某種Python物件。

對於下面的C程式碼

int a = 1;
int b = 2;
int c = a + b;
登入後複製

編譯器總是知道a和b是整數型,在執行相加運算時,流程如下:

1賦值給a

2賦值給b

#呼叫binary_add(a, b)

#把結果賦值給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(a, b)

1.a->PyObject_HEAD取得型別編碼

2.a是一個整數型;值為a ->val

3.b->PyObject_HEAD取得型別編碼

4.b是整數型,值為b->val

##5.調用binary_add(a->val, b->val)

6.結果為整數,存在result中

第四步,建立物件c

1.設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中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!