Julia - 基于值数组过滤的最快方法?

ndw*_*ndw 5 julia

df 是一个 120 万行的 DataFrame

valid 是一个包含 16000 个要过滤的有效值的数组

我尝试对过滤器使用列表理解,但由于搜索两个数组,速度非常慢。

df[[i in valid for i in df[:match],:]

什么是更快的方法来做到这一点?用在哪里?“过滤”功能?

Prz*_*fel 5

搜索集合将非常快:

const validset = Set(valid)
filter((x)-> x.match in validset,df)
Run Code Online (Sandbox Code Playgroud)

一些表现:

julia> df=DataFrame(match=rand(1:(10^8),10^6));

julia> valid = collect(1:1_000_000); validset=Set(valid)

julia> @btime filter((x)-> x.match in $validset,$df)
  173.341 ms (3999506 allocations: 61.30 MiB)
Run Code Online (Sandbox Code Playgroud)

或者 Bogumil 推荐的更快的版本:

julia> @btime filter(:match => in($validset),$df)
  37.500 ms (23 allocations: 282.44 KiB)
Run Code Online (Sandbox Code Playgroud)