回答編集履歴

3

typo

2024/05/05 00:50

投稿

ujimushi_sradjp
ujimushi_sradjp

スコア2150

test CHANGED
@@ -55,7 +55,7 @@
55
55
 
56
56
  と実行時間が逆転します。これはコピー有無の差ですね。
57
57
 
58
- `@view a[in.(a.a, [testList]), :]` : 4.746 ms
58
+ `@benchmark @view a[in.(a.a, [testList]), :]` : 4.746 ms
59
59
 
60
60
  なので,これが一番速そうです。なお,蛇足ですが
61
61
 

2

思いついてやってみたことを再追記

2024/05/05 00:47

投稿

ujimushi_sradjp
ujimushi_sradjp

スコア2150

test CHANGED
@@ -38,3 +38,28 @@
38
38
 
39
39
  結果はDataFrameではなくSubDataFrameになるので,大元のDataFrameを変更すると変になったりするので,少し注意が必要かもしれません。
40
40
 
41
+ ### 再追記
42
+
43
+ なお,テストについては,実際のDataFrameと同じ12列でやった方がいいと思います。
44
+ 例えば次のように12列のデータフレームを設定した場合,
45
+
46
+ ```julia
47
+ a = DataFrame(
48
+ NamedTuple(map(x -> x => rand(1:10, 1000000), Symbol.('a':'l')))
49
+ )
50
+ ```
51
+ 手元の環境だと
52
+
53
+ `@benchmark a[in.(a.a, [testList]), :]` : 12.929 ms
54
+ `@benchmark filter(:a => in($testList2), $a, view = true)` : 9.107 ms
55
+
56
+ と実行時間が逆転します。これはコピー有無の差ですね。
57
+
58
+ `@view a[in.(a.a, [testList]), :]` : 4.746 ms
59
+
60
+ なので,これが一番速そうです。なお,蛇足ですが
61
+
62
+ `df = @view a[in.(a.a, [testList]), :]`
63
+
64
+ のような感じで使います。
65
+

1

@viewで得られる結果の型が元のソースと違う旨を追記

2024/05/04 15:41

投稿

ujimushi_sradjp
ujimushi_sradjp

スコア2150

test CHANGED
@@ -34,3 +34,7 @@
34
34
  Memory estimate: 9.27 MiB, allocs estimate: 23.
35
35
  ```
36
36
 
37
+ ### 追記
38
+
39
+ 結果はDataFrameではなくSubDataFrameになるので,大元のDataFrameを変更すると変になったりするので,少し注意が必要かもしれません。
40
+