ruby - 集合的性能 V.S. Ruby 中的数组

标签 ruby

在 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 , uniqArray#|使用 eql?hash在你的对象上,而不是 <=> .这些需要以合理的方式定义,因为默认情况下对象永远不会 eql?除非他们有相同的 object_id (参见 this question)

关于ruby - 集合的性能 V.S. Ruby 中的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11991835/

相关文章:

ruby - 验证一系列消息被发送到不同的对象/类

ruby - 从 ftp、ruby、Net::FTP 中删除非空目录

ruby-on-rails - Ruby on Rails - 查找值等于 NaN 的位置

ruby - 通过 Gmail API 创建包含收件人的 Gmail 草稿

ruby - sinatra 应用程序不会在运行时启动

ruby - 我可以在不更改源代码的情况下使用 redgreen 运行我们的测试吗?

Ruby EventMachine - 如何将值从 EM::Deferrable 返回到主 EM 循环?

ruby - 我总是在使用 Mechanize 的 UTF-8 错误中得到一个无效的字节序列

ruby 正则表达式命名和组

ruby-on-rails - 有没有办法在所有 Heroku 测功机上运行命令?