Python一種動態類型,解釋性的語言,對於許多開發者來說,Python運行慢是眾所周知的事情,其萬物皆對象的特性,就是導致其運行慢的一個原因,下面本篇文章就來跟大家介紹一下python慢的一些原因,希望對你們有幫助。
python是動態語言不是靜態性語言
這是說在python程式執行的時候,編譯器不知道變數的類型。在C中編譯器知道變數在定義時的類型,而python中執行的時候只知道它是一個物件。
因此,如果您在C中編寫以下內容:
/ * C代码* / int a = 1 ; int b = 2 ; int c = a + b ;
C編譯器從一開始就知道a並且b是整數:它們根本不可能是其他任何東西!有了這些知識,它可以呼叫添加兩個整數的例程,傳回另一個整數,它在記憶體中只是一個簡單的值。
在C中執行的流程大概如下:
1、 分配
2、分配
3、 呼叫二進位加法binary_add(a, b)
4、將結構分配給c變數
python中等效的程式碼如下:
# python code a = 1 b = 2 c = a + b
這裡解譯器只知道1和2是對象,但不知道它們是什麼類型的對象。因此解釋器必須檢查每個變數的PyObject_HEAD以找到類型訊息,然後為這兩種類型呼叫適當的求和例程。最後,它必須建立並初始化一個新的Python物件來保存回傳值。
執行流程大致如下:
1、指派1給a
(1)設定a->PyObject_HEAD->typecode為整數
# (2)設定Seta->val = 1
##2、分配2給b (1)設定b->PyObject_HEAD->typecode為整數
#############################14 ## (2)設定b->val = 2######3、呼叫二進位加法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,是一個整數。 ######4、建立新的物件c###### (1)設定c->PyObject_HEAD->typecode為整數###### (2)將c->val分配給結果######動態類型意味著任何操作都需要更多的步驟。這是Python在數值資料操作方面比C慢的主要原因。 #########python是解釋性語言而不是編譯性語言#########解釋型語言與編譯型語言它們本身的區別也會造成程式在執行的時候的速度差異。一個智慧化的編譯器可以預測並針對重複和不必要的操作進行最佳化。這也會提升程式執行的速度。 #########Python的物件模型會帶來低效率的記憶體存取#########在在上面的例子中,相對於C語言,在python中對整數進行操作會有一個額外的類型資訊層。當有很多的整數並且希望進行某種批次操作時,在python中往往會使用一個list,而在C中會使用某個基於快取區的陣列。在Numpy數組的最簡單的形式是一個圍繞著C中的數字組成的一個python物件。也就是說Numpy有一個指針指向連續緩存區數據的值,而在python中,python列表有一個只想緩存區的指針,每個指針都指向一個python緩存對象,而且每個對像都綁定一個數據(本例中是整數)。 ######這兩種情況的原理圖:###############從上圖可以很明顯的看出,當資料操作時(例如排序、計算、查找等),無論是在存續成本或是存取成本上,Numpy都比python更加的有效率。 ###
以上是python為什麼慢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!