3

私はPythonが初めてで、パンダも初めてです。

私はそれを使用したいと思いますが、2つの列のパンダフィルタリングを辞書のリスト(両方とも80行)と比較すると、パフォーマンスに大きな違いがあるようです。私の大きな疑問は、パンダの実行に時間がかかる理由です。

パンダデータフレーム

timeit a = dfEnts[(dfEnts["col"]=="ro") & (dfEnts["sty"]=="hz")]

1000 ループ、ベストオブ 3:ループあたり239 us

対 dics の単純なリスト

timeit b = [ix for ix,ent in enumerate(ents) if (ent['col']=="ro") & (ent["sty"]=="hz")]

100000 ループ、ベストオブ 3:ループあたり11.4 us

vs numpy 構造化/レコード配列

timeit a = entsRec[(entsRec["col"]=="ro") & (entsRec["sty"]=="hz")]

100000 ループ、ベストオブ 3:ループあたり18.2 us

パンダを使用するが、同様の応答時間を持つ他の良い方法はありますか?


スクリプトは次のようになります..

ents = []

for idx in xrange(0,80)

    dic = {'n':f, 'p':props,'li':li,'col':col,'sty':sty,'nu':nu,'ge':ge,'rr':rr,'ssty':ssty} 
    ents.append(dic)

# DataFrame
dfEnts = pd.DataFrame(ents)

# np rec array
entsTuples = [(ent[ 'n'],ent['p'], ent[ 'li'],ent['col'], ent[ 'sty'], ent['nu'],ent['ge'],ent[ 'rr'], ent['ssty']) for ent in ents]
ents_dt = dtype([('n', 'O'), ('p', 'O'), ('li', 'i1'), ('col', 'O'), ('sty', 'O'), ('nu', 'i1'), ('ge', 'i1'), ('rr', 'i1'), ('ssty', '<i4')])
entsRec = np.array(entsTuples,ents_dt)

そして、私はそれを計ります。


4

1 に答える 1

1

リストの内包表記と辞書検索は Python で非常に最適化されているため、小さなデータ セットで作業する場合、リストを使用するとパフォーマンスがわずかに向上する可能性があります。しかし、通常はわずかな違いです。より大きなデータ セットを操作してみると、はるかに大きな違いに気づき、pandas ライブラリが提供する利点を感じ始めるでしょう。

ents = []
for i in xrange(0, 10000000):
    dic = {
        'n': i, 'p': i, 'li': i, 'col': i, 'sty': i,
        'nu': i, 'ge': i, 'rr': i, 'ssty': i
    } 
    ents.append(dic)
dfEnts = pd.DataFrame(ents)

%%timeit
a = dfEnts[(dfEnts["col"] == 44) & (dfEnts["sty"]== 44)]
10 loops, best of 3: 96.1 ms per loop

%%timeit
b = [ix for ix,ent in enumerate(ents) if (ent['col'] == 44) & (ent["sty"] == 44)]
1 loops, best of 3: 1.68 s per loop

また、パンダDataFrameは辞書のリストよりもはるかに多くの機能を提供するため、比較することさえできないと思います。

于 2013-08-13T15:32:02.370 に答える