99热99这里只有精品6国产,亚洲中文字幕在线天天更新,在线观看亚洲精品国产福利片 ,久久久久综合网

歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋果6袋
6
麥子學(xué)院

Swift中集合的 reduce 操作如何實(shí)現(xiàn)?

發(fā)布時(shí)間:2016-12-27 22:03  回復(fù):0  查看:2449   最后回復(fù):2016-12-27 22:03  
一位朋友問我:「在 swift開發(fā)中, 對集合執(zhí)行 reduce  操作的時(shí)候,是否有比  .reduce(Set()) { $0.union(CollectionOfOne($1)) } 更好的方法?」。這位朋友需要從一個(gè)外部數(shù)據(jù)源中獲取相關(guān)的數(shù)據(jù)結(jié)果,然后將其填充到集合里。
  我們就如何實(shí)現(xiàn)這一點(diǎn)提出了一些想法。在獲取所有項(xiàng)目(item )之前,是否需要對集合進(jìn)行檢索呢?(答案是不需要)數(shù)據(jù)集是否會(huì)過于龐大,以至于不可能在創(chuàng)建集合之前將中間結(jié)果存儲(chǔ)到數(shù)組當(dāng)中?(答案是不會(huì))。
  我構(gòu)建了一套測試,首先嘗試他的 reduce  方法,此外也嘗試了通常所使用的  insert  等多種操作。我事前以為使用  Set 的構(gòu)造器來處理已預(yù)先計(jì)算  (pre-computed)  的數(shù)組可能是最好的方法,但是事實(shí)證明: union  和  insert  在重復(fù)測試中的表現(xiàn)更好。
  timetest("initializer") { // 0.652348856034223
  var x: Set= []
  (1 ... 5_000).forEach { _ in
  x = Set(letters)
  }
  }
  timetest("union") { // 0.524669112986885
  var x: Set= []
  (1 ... 5_000).forEach { _ in
  x = x.union(letters)
  }
  }
  timetest("insert") { // 0.572339564969297
  var x: Set= []
  (1 ... 5_000).forEach { _ in
  x = []
  letters.forEach ({ x.insert($0) })
  }
  }
  timetest("reduce") { // 0.762973523989785
  (1 ... 5_000).forEach { _ in
  var x = letters.reduce(Set()) {
  $0.union(CollectionOfOne($1))
  }
  }
  }
   這結(jié)果令我感到驚訝,因?yàn)槟赡軙?huì)覺得 init<Source : Sequence where Source.Iterator.Element == Element>(_ sequence: Source)  以及  func union<S : Sequence where S.Iterator.Element == Element>(_ other: S) -> Set<Element>  擁有相同的性能。
不過我不感到驚訝的一點(diǎn)是:比起將中間數(shù)據(jù)存儲(chǔ)在數(shù)組當(dāng)中并籍此來直接構(gòu)建集合,使用 reduce  來不停地構(gòu)建集合的性能開銷要大很多。只要數(shù)組的尺寸受到合理的限制(需要足夠大,但是也不能太大,否則就會(huì)對應(yīng)用內(nèi)存造成負(fù)擔(dān)),那么使用中間數(shù)組無疑是一個(gè)更好的辦法。不過對于海量數(shù)據(jù)而言, Set(collectedResults)  的性能比  insert formUnion  以及  reduce/union  更優(yōu)異。
來源:swiftgg
您還未登錄,請先登錄

熱門帖子

最新帖子

?