本文就Pandas的運作效率作一個比較的測試,來探討用哪些方式,會使得運作效率較好。
測試環境如下:
windows 7, 64位元
python 3.5
#pandas 0.19.2
numpy 1.11.3
jupyter notebook
#需要說明的是,不同的系統,不同的電腦配置,不同的軟體環境,運作結果可能有些差異。就算是同一台電腦,每次運作時,運作結果也不完全一樣。
測試的內容為,分別用三種方法來計算一個簡單的運算過程,即 a*a+b*b 。
三種方法分別是:
python的for迴圈
Pandas的Series
Numpy的ndarray
首先建構一個DataFrame,資料量的大小,即DataFrame的行數,分別為10, 100, 1000, … ,直到10,000,000(一千萬)。
然後在jupyter notebook中,用下面的程式碼分別去測試,來查看不同方法下的運行時間,做一個比較。
import pandas as pdimport numpy as np# 100分别用 10,100,...,10,000,000来替换运行list_a = list(range(100))# 200分别用 20,200,...,20,000,000来替换运行list_b = list(range(100,200)) print(len(list_a)) print(len(list_b)) df = pd.DataFrame({'a':list_a, 'b':list_b}) print('数据维度为:{}'.format(df.shape)) print(len(df)) print(df.head())
100 100 数据维度为:(100, 2) 100 a b 0 0 100 1 1 101 2 2 102 3 3 103 4 4 104
執行運算, a*a + b*b
Method 1: for迴圈
%%timeit# 当DataFrame的行数大于等于1000000时,请用 %%time 命令for i in range(len(df)): df['a'][i]*df['a'][i]+df['b'][i]*df['b'][i]
100 loops, best of 3: 12.8 ms per loop
Method 2: Series
type(df['a'])
pandas.core.series.Series
%%timeit df['a']*df['a']+df['b']*df['b']
The slowest run took 5.41 times longer than the fastest. This could mean that an intermediate result is being cached. 1000 loops, best of 3: 669 µs per loop
Method 3: ndarray
type(df['a'].values)
numpy.ndarray
%%timeit df['a'].values*df['a'].values+df['b'].values*df['b'].values
10000 loops, best of 3: 34.2 µs per loop
#運行結果如下:
##從運行結果可以看出,for迴圈明顯比Series和ndarray慢很多,且資料量越大,差異越明顯。當資料量達到一千萬行時,for迴圈的表現也差一萬倍以上。 而Series和ndarray的差異則沒有那麼大。
PS: 1000萬行時,for迴圈運轉耗時特別長,各位若要測試,需要注意下,請用%%time 指令(只測試一次)。
下面透過圖表來比較下Series和ndarray之間的表現。 從上圖可以看出,當資料小於10萬行時,ndarray的表現會比Series好。而當資料行數大於100萬行時,Series的表現要稍微好於ndarray。當然,兩者的差異並不是特別明顯。 所以一般情況下,個人建議,for循環,能不用則不用,而當數量不是特別大時,建議使用ndarray(即df['col'].values)來進行運算,運作效率相對來說要好些。
以上是Python: Pandas如何有效率運算的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!