密かに dplyr 様のパイプ処理を可能にしていた julia の Query.jl の異常な速度の不思議
Query.jl と dplyr 様のパイプ処理 DataFrames.jl のドキュメントには、Query.jl の紹介があります。Query.jl は、本来、Language INtegrated Query; LINQ (リンクと読むらしい) (様)の様式で、DataFrame 等の形式のデータの内部情報に問いかけるためのパッケージです。 R の dplyr は、DataTable のデータ操作に特化したパッケージという意味では、ご存知で、使っていらっしゃる方も多いと考えます。 なんと、Query.jl は 2017年9月の 0.7x から、dplyr 様のパイプ処理ができるようになっていたようです。 Query.jl は、2016年ごろ使った感触では、やたらに遅い印象でした。さすがに、dplyr 様のパイプ処理ができるようになったとのことなので、また、試してみたくなりました。特定の条件を満たす行を抜き出す filter (@where) に特化して試してみます。 はじめに、DataFrames.jl のおさらい まずは、10 8 × 3 の DataFrame を乱数で作ります。 df = DataFrame( col1 = randn(10^8), col2 = randn(10^8), col3 = randn(10^8) ) つぎに、ここから、col1 >0 かつ col2>0 となる行を抜き出してみましょう。 df[collect(df[:col1].>0) .& collect(df[:col2].>0) , :] または df[.&(collect(df[:col1].>0) , collect(df[:col2].>0)),:] です。ひと昔前だと、findall() で true の行数を抜き出した方が早かったのですが、一般的には、あまり影響ないようです。 ただし、findall() は ture が極端に少いと効くかもしれません。 では、試運転の後、@time で速度を測定してみましょう。for ループで単純に5回測定します。 julia> for i in 1:5 @time df[collec...