2012-12-03 48 views
1

我注意到在大熊貓數據框上使用IX時會出現一些奇怪的行爲。IX呼叫上是否有Pandas Cache值?

當我連續50次在同一個數據幀上調用.ix時,它的運行速度比我在50個不同數據幀上調用.ix快10倍。

緩存是否在.ix的幕後進行?我注意到底部循環加倍了我的內存使用量。記憶爲什麼會增加?

有什麼辦法可以修改這個行爲嗎?

請注意,如果直接使用numpy,則在兩種情況下都會以7.4秒的速度運行,並增加0次內存,這就是我認爲熊貓正在緩存的原因。

顯然,你永遠要調用.IX每個元素上...

import pandas as pd 
import numpy as np 
import datetime as dt 
print 'pandas', pd.__version__ 

li_list = [] 
for i in range(50): 
    li_list.append(pd.DataFrame(data=np.random.randn(50, 17000))) 

print 'starting' 

dt_start = dt.datetime.now() 
a = 0 
for i in range(50): 
    b = li_list[0] #Only access first element 
    for j in b.columns: 
     a += b.ix[i, j] 
print (dt.datetime.now()-dt_start).total_seconds() 


dt_start = dt.datetime.now() 
a = 0 
for i in range(50): 
    b = li_list[i] #Access all in list 
    for j in b.columns: 
     a += b.ix[i, j] 
print (dt.datetime.now()-dt_start).total_seconds() 

輸出:

pandas 0.9.1 
starting 
3.651 
22.009 

回答

1

注意:第一次在軸索引中查找位置時,有一個散列表填充步驟。這可能是你在這裏看到的,並且使用timeit(因爲哈希表計算一次,存儲和重用)會被遮擋。還解釋了增加的內存使用情況。

在未來版本的熊貓中,我計劃通過簡單的順序軸索引來簡化這類代碼的性能。我將在GitHub問題跟蹤器上記錄您的用例。

https://github.com/pydata/pandas/issues/2420

2

是,ix緩存結果。 b.ix返回_NDFrameIndexer。它的__getitem__方法調用DataFrame的get_value方法,該方法調用_get_item_cache方法,該方法緩存結果。

緩存也可以解釋爲什麼訪問第一個DataFrame 50次比訪問50個DataFrame快。