Python: Pandas運算的效率探討以及如何選擇高效的運算方式

本文就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 pd
import 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)來進行計算,運行效率相對來說要好些。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章