我正在使用我的一个模型中的序列化数组字段,特别是计算每个数组的共享成员数。
现在,根据我的项目的性质,我需要进行大量的重叠计数..所以我想知道是否有一种超快速,切割方式来做到这一点。
目前,我正在使用'&'方法,所以我的代码看起来像这样
(user1.follower_names & user2.follower_names).count
工作得很好......但我希望有更快的方法可以做到。
答案 0 :(得分:4)
设置更快。
require 'benchmark'
require 'set'
alphabet = ('a'..'z').to_a
user1_followers = 100.times.map{ alphabet.sample(3) }
user2_followers = 100.times.map{ alphabet.sample(3) }
user1_followers_set = user1_followers.to_set
user2_followers_set = user2_followers.to_set
n = 1000
Benchmark.bm(7) do |x|
x.report('arrays'){ n.times{ (user1_followers & user2_followers).size } }
x.report('set'){ n.times{ (user1_followers_set & user2_followers_set).size } }
end
输出:
user system total real
arrays 0.910000 0.000000 0.910000 ( 0.926098)
set 0.350000 0.000000 0.350000 ( 0.359571)
答案 1 :(得分:1)
上述的替代方法是在数组上使用' - '运算符:
user1.follower_names.size - (user1.follower_names - user2.follower_names).size
基本上,这会获得列表1的大小,并且在没有交集的情况下减少联合列表的大小。这不如使用集合那么快,但比单独使用与数组的交集
要快得多