1

大きなパンダのデータフレームでIXを使用すると、奇妙な動作に気づきました。

同じデータフレームで.ixを50回続けて呼び出した場合、50の異なるデータフレームで.ixを呼び出した場合よりも10倍速く実行されました。

.ixの舞台裏でキャッシュが行われていますか?下のループがメモリ使用量を2倍にすることに気づきました。なぜメモリが増加するのでしょうか?

この動作を変更する方法はありますか?

まっすぐな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
4

2 に答える 2

2

はい、ix結果をキャッシュします。b.ixを返します_NDFrameIndexer。そのメソッドは、結果をキャッシュするメソッドを呼び出す__getitem__DataFrameのget_valueメソッドを呼び出します。_get_item_cache

キャッシングは、最初のDataFrameに50回アクセスする方が、50個のDataFrameからアクセスするよりも速い理由を説明する場合もあります。

于 2012-12-03T22:19:23.307 に答える
1

注:軸インデックスで場所を初めて検索するときは、ハッシュテーブルの作成ステップがあります。これはおそらくここに表示されているものであり、を使用すると不明瞭になりますtimeit(ハッシュテーブルは一度計算され、保存され、再利用されるため)。また、メモリ使用量の増加についても説明します。

パンダの将来のバージョンでは、単純な順次軸インデックスを使用した単純なデータでのこのタイプのコードのパフォーマンスを改善する予定です。ユースケースをGitHub課題追跡システムに記録します。

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

于 2012-12-03T23:06:00.443 に答える