Numpy和Pandas的區別


Numpy:

    首先來說說ndarray,numpy提供了一個N維度的數據類型(ndarray),他描述了相同類型的items集合

    1.ndarray中所有元素的類型都是相同的,而python列表中的元素類型是任意的,所以,ndarray在存儲元素的時候,內存可以連續。而python原生list就只通過尋址法找到下一個元素,這雖然也導致了在通用性能方面,numpy的ndarray不及python原聲的list,但在科學計算中,numpy的ndarray就可以省掉很多循環語句,代碼使用方面也比python原生的list簡單得多

    2.ndarray支持並行化運算

    3.numpy底層使用c語言編寫,內部解除了GIL鎖,對數組的操作速度不受python機制的限制,效率遠遠高於純python的代碼

      GIL鎖:

        熟悉python的都知道,在c語言寫的python解釋器中存在全局解釋器鎖,由於全局解釋器鎖的存在,在同一時間,python解釋器之只能運行一個線程,這大大影響了python多線程的性功能。而這個解釋器由於歷史原因,現在幾乎無法消除。

        python的GIL鎖之所以會影響多線程等性能,是因為在多線程的情況下,只有當多線程獲得了一個全局鎖的時候,那么該線程的代碼才能運行,而全局鎖只有一個,所以使用python多線程在同一時間也只有一個線程在運行,因此在即使多核的情況下也只能發揮出單核的性能y

      python機制:

        解釋器是一種讓其他程序運行起來的程序,他是代碼與機器硬件之間的軟件邏輯層,

        python解釋器就是能夠讓python程序在機器上執行的一套程序。

        當我們執行寫好的python代碼的時候,python解釋器會執行兩個步驟:

          1.把原始代碼編譯成字節碼

          2.把編譯好的字節碼轉發到pthon虛擬機(PVM)中執行

            

 


      內存管理機制:引用計數、垃圾回收、內存池。

      引用計數:

        引用計數是一種非常高效的內存管理手段, 當一個 Python 對象被引用時其引用計數增加1, 當其不再被一個變量引用時則計數減 1. 當引用計數等於0時對象被刪除。

      垃圾回收 :

        1. 引用計數

          引用計數也是一種垃圾收集機制,而且也是一種最直觀,最簡單的垃圾收集技術。當 Python 的某個對象的引用計數降為 0 時,說明沒有任何引用指向該對象,該對象就成為要被回收的垃圾了。比如某個新建對象,它被分配給某個引用,對象的引用計數變為 1。如果引用被刪除,對象的引用計數為 0,那么該對象就可以被垃圾回收。不過如果出現循環引用的話,引用計數機制就不再起有效的作用了

        2. 標記清除

          如果兩個對象的引用計數都為 1,但是僅僅存在他們之間的循環引用,那么這兩個對象都是需要被回收的,也就是說,它們的引用計數雖然表現為非 0,但實際上有效的引用計數為 0。所以先將循環引用摘掉,就會得出這兩個對象的有效計數。

        3. 分代回收

          從前面“標記-清除”這樣的垃圾收集機制來看,這種垃圾收集機制所帶來的額外操作實際上與系統中總的內存塊的數量是相關的,當需要回收的內存塊越多時,垃圾檢測帶來的額外操作就越多,而垃圾回收帶來的額外操作就越少;反之,當需回收的內存塊越少時,垃圾檢測就將比垃圾回收帶來更少的額外操作。

          舉個例子:

            當某些內存塊 M 經過了 3 次垃圾收集的清洗之后還存活時,我們就將內存塊 M 划到一個集合 A 中去,而新分配的內存都划分到集合 B 中去。當垃圾收集開始工作時,大多數情況都只對集合 B 進行垃圾回收,而對集合 A 進行垃圾回收要隔相當長一段時間后才進行,這就使得垃圾收集機制需要處理的內存少了,效率自然就提高了。在這個過程中,集合 B 中的某些內存塊由於存活時間長而會被轉移到集合 A 中,當然,集合 A 中實際上也存在一些垃圾,這些垃圾的回收會因為這種分代的機制而被延遲。

          內存池:

            Python 的內存機制呈現金字塔形狀,-1,-2 層主要有操作系統進行操作;

            第 0 層是 C 中的 malloc,free 等內存分配和釋放函數進行操作;

            第1 層和第 2 層是內存池,有 Python 的接口函數 PyMem_Malloc 函數實現,當對象小於 256K 時有該層直接分配內存;

            第3層是最上層,也就是我們對 Python 對象的直接操作;

            Python 在運行期間會大量地執行 malloc 和 free 的操作,頻繁地在用戶態和核心態之間進行切換,這將嚴重影響 Python 的執行效率。為了加速Python 的執行效率,Python 引入了一個內存池機制,用於管理對小塊內存的申請和釋放。

            Python 內部默認的小塊內存與大塊內存的分界點定在 256 個字節,當申請的內存小於 256 字節時,PyObject_Malloc會在內存池中申請內存;當申請的內存大於 256 字節時,PyObject_Malloc 的行為將蛻化為 malloc 的行為。當然,通過修改 Python 源代碼,我們可以改變這個默認值,從而改變 Python 的默認內存管理行為。

 

pandas:

   pandas是基於numpy的一種工具,該工具是為了解決數據分析任務而建的,pandas納入了大量庫和一些標准的數據庫模型,提供了高效率的操作大型數據集所需要的工具,pandas提供了大量快速便捷的處理數據的函數和方法,使python成為了強大而高效的數據分析環境的重要因素之一

 

          


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM