博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swift 集合的 reduce 操作
阅读量:6338 次
发布时间:2019-06-22

本文共 1518 字,大约阅读时间需要 5 分钟。

作者:Erica Sadun,,原文日期:2016-12-21

译者:;校对:;定稿:

一位朋友问我:「在对集合执行 reduce 操作的时候,是否有比 .reduce(Set<String>()) { $0.union(CollectionOfOne($1)) } 更好的方法?」。这位朋友需要从一个外部数据源中获取相关的数据结果,然后将其填充到集合里。

我们就如何实现这一点提出了一些想法。在获取所有项目(item)之前,是否需要对集合进行检索呢?(答案是不需要)数据集是否会过于庞大,以至于不可能在创建集合之前将中间结果存储到数组当中?(答案是不会)。

我构建了一套测试,首先尝试他的 reduce 方法,此外也尝试了通常所使用的 insert 等多种操作。我事前以为使用 Set 的构造器来处理已预先计算 (pre-computed) 的数组可能是最好的方法,但是事实证明:unioninsert 在重复测试中的表现更好。

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)) } }}

这结果令我感到惊讶,因为您可能会觉得 init<Source : Sequence where Source.Iterator.Element == Element>(_ sequence: Source) 以及 func union<S : Sequence where S.Iterator.Element == Element>(_ other: S) -> Set<Element> 拥有相同的性能。

不过我不感到惊讶的一点是:比起将中间数据存储在数组当中并籍此来直接构建集合,使用 reduce 来不停地构建集合的性能开销要大很多。只要数组的尺寸受到合理的限制(需要足够大,但是也不能太大,否则就会对应用内存造成负担),那么使用中间数组无疑是一个更好的办法。不过对于海量数据而言,Set(collectedResults) 的性能比 insertformUnion 以及 reduce/union 更优异。

本文由 SwiftGG 翻译组翻译,已经获得作者翻译授权,最新文章请访问 。

转载地址:http://mmaoa.baihongyu.com/

你可能感兴趣的文章
Android Picasso
查看>>
top命令
查看>>
javascript的作用域
查看>>
新形势下初创B2B行业网站如何经营
查看>>
初心大陆-----python宝典 第五章之列表
查看>>
java基础学习2
查看>>
sysbench使用笔记
查看>>
有关电子商务信息的介绍
查看>>
NFC·(近距离无线通讯技术)
查看>>
多线程基础(三)NSThread基础
查看>>
PHP的学习--Traits新特性
查看>>
ubuntu下,py2,py3共存,/usr/bin/python: No module named virtualenvwrapper错误解决方法
查看>>
Ext.form.field.Number numberfield
查看>>
Linux文件夹分析
查看>>
解决部分月份绩效无法显示的问题:timestamp\union al\autocommit等的用法
查看>>
nginx 域名跳转 Nginx跳转自动到带www域名规则配置、nginx多域名向主域名跳转
查看>>
man openstack >>1.txt
查看>>
linux几大服务器版本大比拼
查看>>
在BT5系统中安装postgresQL
查看>>
【Magedu】Week01
查看>>