在 Ruby 中,我正在构建一个方法,该方法构造并返回一个(可能很大)数组,该数组不应包含重复元素。我会通过使用集合然后将其转换为数组来获得更好的性能吗?或者直接调用 .uniq
会更好吗?在我返回之前使用的阵列上?或者使用 &
怎么样?将项目附加到数组而不是 +=
?如果我确实使用一套,就不会有 <=>
我放入集合的对象上的方法对性能有影响吗? (如果您不确定,您知道测试这个的方法吗?)
最佳答案
真正的答案是:编写最具可读性和可维护性的代码,只有在证明它是瓶颈后才对其进行优化。如果你能在里面找到算法 is in linear time ,您不必对其进行优化。在这里很容易找到...
不太确定您建议使用哪种方法,但使用我的 fruity
gem :
require 'fruity'
require 'set'
enum = 1000.times
compare do
uniq { enum.each_with_object([]){|x, array| array << x}.uniq }
set { enum.each_with_object(Set[]){|x, set| set << x}.to_a }
join { enum.inject([]){|array, x| array | [x]} }
end
# set is faster than uniq by 10.0% ± 1.0%
# uniq is faster than join by 394x ± 10.0
显然,像第三种方法那样构建中间数组是没有意义的。否则,这不会有太大的不同,因为你会在 O(n)
;这是主要的事情。
顺便说一句,两者都是sets
, uniq
和 Array#|
使用 eql?
和 hash
在你的对象上,而不是 <=>
.这些需要以合理的方式定义,因为默认情况下对象永远不会 eql?
除非他们有相同的 object_id
(参见 this question)
关于ruby - 集合的性能 V.S. Ruby 中的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11991835/