Python計算性能差的幾條原因

也不是完全翻譯,就算是結合了自己使用python得心得,然後看了High Performance Python之後得總結吧 在此總結一下影響Python性能的原因。

Python解釋器做了許多工作來抽象底層得計算單元(包括CPU 各種內存 總線)操作,所以當我們使用Python時,從不用擔心爲數組分配內存得問題,也不用管內存管理得問題。

但這也是把雙刃劍,有好也有壞。

首先,Python對於底層操作得抽象使得vectorization(向量化)計算性能提升方法,不能一步實現。在純Python代碼中,我們不能除以元素均爲float類型數據得列表,只能每次除以其中得一個元素,這就是不能向量化。當然,這個問題可以通過使用類似Numpy這樣得外部庫添加向量化操作來解決。

其次,Python對於底層操作得抽象使得基於使用L1/L2層cache來存儲數據用於下次運算的性能優化方法不能實現。因爲python得garbage_collect機制,使得數據在內存中不得到最優排列,這產生了許多內存碎片,進而會引發以下這種情況,如果某次數據傳遞完全利用了bus得帶寬,但因爲內存碎片造成了一次原算所需數據得缺失,所以本次運算會被丟棄,還要至少再重發一次數據,這就造成了數據發送時間得延長,也會造成性能下降。

然後是Python的動態類型和不被編譯。許多靜態語言,比如C,首先會對代碼進行編譯,而在編譯階段,編譯器會使用很多技巧來最優化所生成得中間代碼以及變量存儲在內存中得排列方式(比如結構體中得邊界對齊).而純Python代碼雖然也進行編譯,但不會像C語言編譯那樣進行存儲優化,而且更糟糕得是,其動態特徵使得對原生Python代碼得優化難以進行,因爲在運行過程中python代碼不斷變化。但現在有一些方法來減輕這種問題對於性能得影響,首先想到得是Cextension,這個第三方模塊讓Python可以被編譯。

最後,是大家最熟悉得GIL(全局線程瑣),這使得純Python代碼在使用多線程技術時,不能利用當前最流行得多核CPU,極大得影響了其計算性能。不過,這個問題可以通過使用multiprocessing模塊來首先進行多進程操作,或使用Cextension等其他方法來克服這個問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章