[Julia]データフレームのフィルターを早くする方法

実現したいこと

データフレームからリストに入っている値を取り出すコードを早くしたいと考えています。

Julia

1a = DataFrame(a = rand(1:10, 1000000), b = rand(1:3, 1000000))2testList = [1,2,3,4]3a[in.(a.a, [testList]), :]

発生している問題・分からないこと

自身でいろいろ試した結果これが一番早かったのですが、実際のユースケースではこれがかなりの時間を消費しており改善したいと思っています。
実際は30個の値が入っている辞書をループし毎回255,856行, 12列のデータフレームから値を取り出す作業を行っています。

Julia

1for (key, val) in diffChecked 2 group = df[in.(df.val, [val]), :]3end

Profviewを使用して使用時間を見てみたところ、構造としては上から
broadcast.jlのmaterialize→copy→copyto_nonleaf!→getindex→_broadcast_getindex→_broadcast_getindex_evalf→in
となっていました。

該当のソースコード

特になし

試したこと・調べたこと

上記の詳細・結果

試しにfilter関数に変更してみたりsetを使用してみたりと変更を加えたのですがやはり元の形が一番早いという結果でした。

Julia

1a = DataFrame(a = rand(1:10, 1000000), b = rand(1:3, 1000000))2testList = [1,2,3,4]3testList2 = Set([1,2,3,4])4 5a[in.(a.a, [testList]), :]6filter(:a => in(testList2), a, view=true)7 8テスト19@benchmark a[in.(a.a, [testList]), :]10テスト211@benchmark filter(:a => in($testList2), $a, view = true)

テスト1では平均時間が8.184msだったのがテスト2では8.395msという結果でした。

補足

特になし

コメントを投稿

0 コメント