2016-10-04 1 views
10

my_series.iat[0]ではなくmy_series.values[0]を使用して直列要素にアクセスすることで、6倍のパフォーマンス向上に驚いた。6倍のパフォーマンス向上のために.iatではなく.valuesを使用してみませんか?

documentationによれば、.iatは、スカラーへの高速アクセスに推奨される方法です。 .valuesを使って何も見つからないのですか?いくつかの実験に基づいて

import numpy as np 
import pandas as pd 

n = 1000 
dct = {'A': np.random.rand(n)} 
df = pd.DataFrame(dct) 
s = df['A'] 
vals = s.values 

%timeit -n 10000 val = s.iloc[0] 
%timeit -n 10000 val = s.iat[0] 
%timeit -n 10000 val = s.values[0] 
%timeit -n 10000 vals[0] 

**Output** 
10000 loops, best of 3: 24.3 µs per loop 
10000 loops, best of 3: 13.4 µs per loop 
10000 loops, best of 3: 2.06 µs per loop 
10000 loops, best of 3: 337 ns per loop 
+0

非常に類似した質問(パンダバージョン0.18.0を使用して上記のタイミング):http://stackoverflow.com/questions/28909034/pandas-scalar-value-getting-and-setting-ix-or- iat?rq = 1 loc/ilocは一般的にixよりも推奨されていることに注意してください。しかし、ixの背後にはloc/ilocにいくらか類似していると思われますので、 – JohnE

答えて

2

、あなたが(通常の場合)複数の列を持っている場合iatvalues間の速度差がかなり狭くことが表示されます。また面白いかもしれ何

n = 1000 
dct = {'A': np.random.rand(n), 'B': np.random.rand(n) } 
df = pd.DataFrame(dct) 

%timeit df.iat[n-5,1] 
100000 loops, best of 3: 9.72 µs per loop 

%timeit df.B.values[n-5] 
100000 loops, best of 3: 7.3 µs per loop 

は、あなたが直接セルにアクセスするかどうかは重要で、または最初の列、およびその行を選択することができるということです。

iatの場合、それは完全なデータフレーム上でそれを使用することをお勧めします:

%timeit df.iat[n-5,1] 
100000 loops, best of 3: 9.72 µs per loop 

%timeit df.B.iat[n-5] 
100000 loops, best of 3: 15.4 µs per loop 

しかしvaluesの場合には、それが列を選択すると良いでしょうし、その後valuesを使用します。

%timeit df.values[n-5,1] 
100000 loops, best of 3: 9.42 µs per loop 

%timeit df.B.values[n-5] 
100000 loops, best of 3: 7.3 µs per loop 

いずれにしても、iatの代わりにvaluesを使用すると、最悪の場合同等の速度を示すように見えるため、iatよりポジション・ベースの索引付けを使用している場合(構文が好きな場合を除きます)。

は逆に、ラベルベースのインデックスはvaluesでは不可能であり、その場合にはatvaluesと組み合わせてlocを使用するよりもはるかに高速になります。

ここ

関連する問題