Numpy和Pandas的區別

2022-05-25 03:27:09 字數 2525 閱讀 4221

首先來說說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是基於numpy的一種工具,該工具是為了解決資料分析任務而建的,pandas納入了大量庫和一些標準的資料庫模型,提供了高效率的操作大型資料集所需要的工具,pandas提供了大量快速便捷的處理資料的函式和方法,使python成為了強大而高效的資料分析環境的重要因素之一

numpy和pandas的常用操作

1 np.zero np.zeros 5 1行5列 結果 array 0.0.0.0.0.np.zeros 2,1 2行1列 結果 array 0.0.2 矩陣乘法 np.dot np.multiply1 讀取csv檔案 引數 names,自定義列名 keep default na false,沒有...

numpy和pandas中set option總結

import warnings import numpy as np import pandas as pd warnings.filterwarnings ignore 關閉執行時的警告 np.set printoptions linewidth 100,suppress true 列印numpy...

python安裝numpy和pandas的方法步驟

最近要對一系列資料做同比比較,需要用到numpy和pandas來計算,不過使用python安裝numpy和pandas因為linux環境沒有外網遇到了很多問題就記下來了。首要條件,python版本必須是2.7以上。linux首先安裝依賴包 yum y install blas blas devel ...