首頁 >後端開發 >Python教學 >Python: Pandas如何有效率運算的方法

Python: Pandas如何有效率運算的方法

巴扎黑
巴扎黑原創
2017-07-19 13:38:561306瀏覽

本文就Pandas的運作效率作一個比較的測試,來探討用哪些方式,會使得運作效率較好。

測試環境如下:

  • windows 7, 64位元

  • python 3.5

  • #pandas 0.19.2

  • numpy 1.11.3

  • jupyter notebook

#需要說明的是,不同的系統,不同的電腦配置,不同的軟體環境,運作結果可能有些差異。就算是同一台電腦,每次運作時,運作結果也不完全一樣。

1 測試內容

測試的內容為,分別用三種方法來計算一個簡單的運算過程,即 a*a+b*b 。

三種方法分別是:

  1. python的for迴圈

  2. Pandas的Series

  3. 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

2 測試結果

#運行結果如下:

##從運行結果可以看出,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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn