2016-10-04 13 views
10

my_series.iat[0] yerine my_series.values[0] kullanarak seri öğelere erişerek elde ettiğim 6x performans iyileştirmesinde şaşırdım.Neden 6x performans iyileştirmesi için .iat yerine .values ​​kullanmıyorsunuz?

documentation, .iat, skalerlere hızlı erişim için önerilen yoldur. .values kullanarak herhangi bir şey eksik miyim? bir bazı deneylere göre

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

çok benzer soru (pandalar sürümünü 0.18.0 kullanarak yukarıdaki zamanlamaları): http://stackoverflow.com/questions/28909034/pandas-scalar-value-getting-and-setting-ix-or- iat? rq = 1 Yerel/iloc'nin günümüzde ix üzerinden genel olarak önerildiğini unutmayın, ancak ix sahnelerinin arkasında loc/iloc ile benzer şekilde çalıştığına inanıyorum. – JohnE

cevap

2

, iat ve values arasındaki hız farkı (genellikle durumda) birden çok sütun ciddi şekilde daralır görünür.

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 

Ne de ilginç olabilir o doğrudan hücreye erişimine olması fark, ya da ilk sütunu, ardından satırı seçin olabilir. iat durumunda

, tam dataframe üzerinde kullanmak daha iyidir:

%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 

Ama values durumunda, bu sütunu seçin ve ardından kullanmak daha iyidir 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 

Ancak, herhangi bir olayda, iat yerine values kullanmak, en düşük hızda benzer bir hız sunuyor gibi görünüyor, dolayısıylaüzerinden iat'dan küçük bir değer eklenmiş gibi görünüyorpozisyon tabanlı indeksleme kullanıyorsanız (sözdizimini tercih etmediğiniz sürece).

Tersine, etiket bazlı indeksleme values birlikte loc kullanarak çok daha hızlı olacaktır values ile ve bu durumda at mümkün değildir.

burada

İlgili konular