この記事では、Pandas の操作効率を比較テストして、どの方法で操作効率を向上できるかを検討します。
テスト環境は次のとおりです:
windows 7、64ビット
python 3.5
pandas 0.19.2
numpy 1.11.3
ジュピターノートブック
説明が必要です。はい、システム、コンピューター構成、ソフトウェア環境が異なれば、動作結果も異なる可能性があります。同じコンピュータであっても、実行するたびに結果がまったく同じになるわけではありません。
テストの内容は、a*a+b*bという簡単な演算過程を3つの方法で計算するというものです。
その 3 つのメソッドは次のとおりです:
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
方法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
方法2:シリーズ
メソッド3: ndarray
type(df['a'])
pandas.core.series.Series
%%timeit df['a']*df['a']+df['b']*df['b']
実行結果は次のとおりです:
実行結果からわかるように、for ループは Series や ndarray よりも明らかに遅く、サイズが大きくなります。データの量が増えるほど、違いはより明らかになります。 データ量が 1,000 万行に達すると、for ループのパフォーマンスは 10,000 倍以上低下します。 Series と ndarray の違いはそれほど大きくありません。
追記: 1,000 万行がある場合、for ループの実行に非常に時間がかかります。テストする場合は、%%time コマンドを使用してください (テストは 1 回のみ)。
次のグラフは、Series と ndarray のパフォーマンスを比較しています。
上の図からわかるように、データが 100,000 行未満の場合、ndarray は Series よりもパフォーマンスが優れています。データ行の数が 100 万行を超える場合、Series のパフォーマンスは ndarray よりわずかに優れています。もちろん、この 2 つの違いは特に明らかではありません。
そのため、通常の状況では、可能であれば、for ループを使用することをお勧めします。数値が特に大きくない場合は、計算に ndarray (つまり、df['col'].values) を使用することをお勧めします。稼働率は比較的低いほうだと言えます。
以上がPython: Pandas が効率的に動作する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。