本文目錄一覽:
- 1、python語言的缺點
- 2、用python處理一個1G左右的數據集,運行速度非常慢,怎樣優化
- 3、Python 執行速度慢只是因為它是解釋型語言嗎
- 4、python語言運行速度如此差?
- 5、python 處理大數據程序運行的越來越慢的問題
python語言的缺點
Python並不是沒有缺點的,最主要的缺點有以下幾個:
Python的執行速度不夠快。當然,這也不是一個很嚴重的問題,一般情況下,我們不會拿Python語言與C/C++這樣的語言進行直接比較。在Python語言的執行速度上,一方面,網路或磁碟的延遲,會抵消掉部分Python本身消耗的時間;另一方面,因為Python特別容易和C結合起來,因此,我們可以通過分離一部分需要優化速度的應用,將其轉換為編譯好的擴展,並在整個系統中使用Python腳本將這部分應用連接起來,以提高程序的整體效率。
Python的GIL鎖限制並發:Python的另一個大問題是,對多處理器支持不好。如果讀者接觸Python時間比較長,那麼,一定聽說過GIL這個詞。GIL是指Python全局解釋器鎖(GlobalInterpreterLock),當Python的默認解釋器要執行位元組碼時,都需要先申請這個鎖。這意味著,如果試圖通過多線程擴展應用程序,將總是被這個全局解釋器鎖限制。當然,我們可以使用多進程的架構來提高程序的並發,也可以選擇不同的Python實現來運行我們的程序。
Python2與Python3不兼容:如果一個普通的軟體或者庫,不能夠做到後向兼容,那麼,它會被用戶無情的拋棄了。在Python中,一個槽點是Python2與Python3不兼容。因為Python沒有向後兼容,給所有的Python工程師帶來了無數的煩惱。
用python處理一個1G左右的數據集,運行速度非常慢,怎樣優化
第一個辦法,降低數據集的大小。python處理數據,如果數據結構中的數據超過2GB,通常都會很慢。如何降低數據集大小,需要修改演算法。
第二個辦法,將數據結構採用數組array或者是numarray存貯。這樣內存數量與查找效率都會提高。盡量不要使用大的dict。使用一個省內存的blist代替list
第三個辦法,將數據通過共享內存,讓C++擴展模塊來處理。
常用的是第二種辦法。就是換個數據結構就可以提高效率。
Python 執行速度慢只是因為它是解釋型語言嗎
Python 不是解釋型語言,事實上也沒有「解釋型」語言這個分類。
Python 性能略有不佳的原因可能有幾個:
首先是 Python 希望自己是一個簡單和優雅的語言,需要性能的組件通常用 C 實現,沒有太多改進性能的動力。
然後 Python 具有垃圾回收和自動的內存管理功能,並且採用動態類型系統,會在運行時進行類型檢查,這會不可避免地略微影響性能,使其不如靜態類型(Java)或沒有垃圾回收(C/C++)的語言。
摘自維基百科:
「Python開發人員盡量避開不成熟或者不重要的優化。一些針對非重要部位的加快運行速度的補丁通常不會被合併到Python內。」
「因為Python屬於動態類型語言,動態類型語言是在運行期間檢查數據的類型,不得不保持描述變數值的實際類型標記,程序在每次操作變數時,需要執行數據依賴分支」
python語言運行速度如此差?
這就要說到 Python 類語言和 C 類語言的主要區別了,Python 屬於解釋型語言,通俗來說就是你可以一句一句地輸入,而 Python 解釋器(Interpreter)可以一句一句地執行,而 C 語言屬於編譯型語言,無法做到這一點,只能一次性輸入完成,編譯成一個完整的程序再執行,而這個編譯的過程由於現代編譯器做了非常多的優化,並且你的程序沒有輸入只有輸出,每次運行都出固定的結果,所以極有可能被編譯器優化成為了只有一條輸出語句(實際情況可能要複雜一些),總的來說就是由於二者之間原理的差異導致了性能的差異,你可以搜一搜相關的資料,關掉 C 語言編譯時的優化,再看一下性能,或者將固定的那些值改為運行時需要輸入再看一下效果。
Python 相較於 C 的優勢有很多,性能這一方面你不需要關心,做出一個足夠複雜的程序,它們之間運行效率差不了多少的。
python 處理大數據程序運行的越來越慢的問題
最近編寫並運行了一個處理1500萬個數據的程序,本來最初每秒可以處理150個左右的數據,預計大概15個小時的時間就可以處理完,晚上的時候就開始運行,本以為等到第二天中午就可以得到結果呢,,,
可是,等我第二天的時候一看,什麼???還沒處理完,當前的數據處理速度變成了一秒5個左右,然後還需要等待300個小時。
然後就查了一下這個問題,原來同樣也有很多人在處理大數據的時候遇到了這個問題,大多數的文章分析的原因都是說由於GC(垃圾回收)造成的性能下降。
Python的垃圾回收機制的工作原理為每個對象維護一個引用計數,每次內存對象的創建與銷毀都必須修改引用計數,從而在大量的對象創建時,需要大量的執行修改引用計數操作,對於程序執行過程中,額外的性能開銷是令人可怕的。回收的觸發時機有兩種可能,一是用戶主動調用gc.collect(),二是對象數量超過閾值。
所以正是GC拖慢了程序的性能,所以我們可以考慮在處理的時候禁止垃圾回收。
通過這樣的改進之後速度確度會有很大的提升。但是又有也會另外的一個問題,內存溢出,由於運行的過程中生成大量的對象,一次使用後就沒有了引用,由於關閉了垃圾回收機制,一直存在內存中得不到清理,然後程序的內存使用量越來越大。解決的方法就是定期打開gc.enable()再關閉或者主動調用gc.collect(),這樣就可以了。
通過上述的改進後程序確實了很多,可是我的程序還是運行的越來越慢,我都懷疑人生了,然後分別測試了各個步驟所花費的時間才知道了原因,我使用了pandas創建一個DataFrame,然後每次迭代得到的結果都添加新的數據到DataFrame中,隨著裡邊的數據越來越多,添加的速度也就越來越慢了,嚴重的拖累的運行速度。這裡的解決方法有兩個:
1 分段保存結果,間隔一段時間就保存一次結果,最後再將多次的結果合併。
2 換一個數據存儲方法,我是直接使用了python的字典進行保存結果,它隨著數據的增多添加的速度也會變慢,但是差別不是很大,在可接受的範圍內,可以使用;或者再加上方法1,分段進行保存再合併也是可以的。
原創文章,作者:IVVK,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/135494.html