Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 快速性能的xy阵列_Arrays_Swift_Swift Playground - Fatal编程技术网

Arrays 快速性能的xy阵列

Arrays 快速性能的xy阵列,arrays,swift,swift-playground,Arrays,Swift,Swift Playground,我有两个带浮点数的大数组(数千个值),希望将它们组合成一个xy点数组,以便进一步处理,例如绘图 因此,现在在Xcode游乐场,我正在做以下工作: let xArray = // read from datafile, fast let yArray = // read from another datafile, fast struct xyPoint { let x: Float let y: Float } var spectrum: [xyPoint] = [] for

我有两个带浮点数的大数组(数千个值),希望将它们组合成一个xy点数组,以便进一步处理,例如绘图

因此,现在在Xcode游乐场,我正在做以下工作:

let xArray = // read from datafile, fast
let yArray = // read from another datafile, fast

struct xyPoint {
   let x: Float
   let y: Float
}

var spectrum: [xyPoint] = []

for i in 0..<xArray.count {
    let xy = xyPoint(x: xArray[i], y: yArray[i])
    spectrum.append(xy)
}
让xArray=//快速读取数据文件
让yArray=//快速读取另一个数据文件
结构xyPoint{
让x:浮动
让y:漂浮
}
var频谱:[xyPoint]=[]

对于0中的i..一旦有了两个单独的数组,组合它们就有点麻烦了,而且没有一种简洁的“快速”方法来完成。如果有一个结构数组,其中每个结构都包含一个x和y值,那么可以使用
map
语句将该数组转换为CGPoint对象数组(实际上是另一种结构类型)

你先告诉我们:

let xArray = // read from datafile, fast
let yArray = // read from another datafile, fast
重新编写未显示的代码可能会更好,这样,您可以执行以下操作,而不是先读取所有x点数据文件,然后读取所有y点数据文件:

  • 读一个x点
  • 读一个y点
  • 为该X/Y对创建一个CGPoint
  • 将新的CGPoint添加到
    CGPoint
    值的输出数组中
甚至,重新构造创建数据文件的代码,以便它编写一个包含X/Y对数组的文件,而不是两个单独的文件

如果您有两个单独的数组,则可以使用的变量for。。。在中,为每个数组项提供索引和值:

let xArray: [CGFloat] = [0.1, 0.2, 0.3, 0.4]
let yArray: [CGFloat] = [0.4, 0.3, 0.2, 0.1]

var output = [CGPoint]()
output.reserveCapacity(xArray.count)
for (index, value) in xArray.enumerated() {
    let yValue = yArray[index]
    let aPoint = CGPoint (x: value, y: yValue)
    output.append(aPoint)
}

如果
yArray
的值小于
xArray
,则上述代码将崩溃,如果
yArray
的值大于
xArray
,则将错过
yArray
中的最后一个值。一个完整的实现应该首先进行错误检查,并处理数组具有不同数量的值的情况。

一旦有了两个单独的数组,将它们组合起来会有点尴尬,而且没有一种简洁的“快速”方法可以做到这一点。如果有一个结构数组,其中每个结构都包含一个x和y值,那么可以使用
map
语句将该数组转换为CGPoint对象数组(实际上是另一种结构类型)

你先告诉我们:

let xArray = // read from datafile, fast
let yArray = // read from another datafile, fast
重新编写未显示的代码可能会更好,这样,您可以执行以下操作,而不是先读取所有x点数据文件,然后读取所有y点数据文件:

  • 读一个x点
  • 读一个y点
  • 为该X/Y对创建一个CGPoint
  • 将新的CGPoint添加到
    CGPoint
    值的输出数组中
甚至,重新构造创建数据文件的代码,以便它编写一个包含X/Y对数组的文件,而不是两个单独的文件

如果您有两个单独的数组,则可以使用的变量for。。。在中,为每个数组项提供索引和值:

let xArray: [CGFloat] = [0.1, 0.2, 0.3, 0.4]
let yArray: [CGFloat] = [0.4, 0.3, 0.2, 0.1]

var output = [CGPoint]()
output.reserveCapacity(xArray.count)
for (index, value) in xArray.enumerated() {
    let yValue = yArray[index]
    let aPoint = CGPoint (x: value, y: yValue)
    output.append(aPoint)
}

如果
yArray
的值小于
xArray
,则上述代码将崩溃,如果
yArray
的值大于
xArray
,则将错过
yArray
中的最后一个值。一个完整的实现应该首先进行错误检查,并处理数组具有不同数值的情况。

创建点数组的最简单方法是

let spectrum = zip(xArray, yArray).map(XYPoint.init)
(我冒昧地将struct
XYPoint
称为Swift类型 应以大写字母开头。)这也允许定义 结果数组是一个常量

但是,就执行时间而言,它不是最快的。 原因可能是

  • zip()
    输入是数组的一部分
  • zip()
    返回一个
    序列
    ,因此
    map()
    不知道要创建的元素数。 因此,目标阵列将被重新分配几个位置 时代
因此,如果保留所需的 提前产能:

var spectrum: [XYPoint] = []
spectrum.reserveCapacity(xArray.count)
for i in 0..<xArray.count {
    let xy = XYPoint(x: xArray[i], y: yArray[i])
    spectrum.append(xy)
}
var谱:[XYPoint]=[]
频谱保留容量(xArray.count)

对于0..中的i,创建点阵列的最简单方法是

let spectrum = zip(xArray, yArray).map(XYPoint.init)
(我冒昧地将struct
XYPoint
称为Swift类型 应以大写字母开头。)这也允许定义 结果数组是一个常量

但是,就执行时间而言,它不是最快的。 原因可能是

  • zip()
    输入是数组的一部分
  • zip()
    返回一个
    序列
    ,因此
    map()
    不知道要创建的元素数。 因此,目标阵列将被重新分配几个位置 时代
因此,如果保留所需的 提前产能:

var spectrum: [XYPoint] = []
spectrum.reserveCapacity(xArray.count)
for i in 0..<xArray.count {
    let xy = XYPoint(x: xArray[i], y: yArray[i])
    spectrum.append(xy)
}
var谱:[XYPoint]=[]
频谱保留容量(xArray.count)

对于0..中的i,我检查了您问题的各种解决方案的性能。您可以从下载我的测试

A) 你的代码 C) 范围+地图(我的解决方案)
我的结果(秒)
我检查了您问题的各种解决方案的性能。您可以从下载我的测试

A) 你的代码 C) 范围+地图(我的解决方案)
我的结果(秒)
在主文件中运行代码时,可能会启用日志记录。这给代码增加了巨大的性能冲击

我在问题中尝试了你的代码作为函数。将函数放入10000大小数组的主swift文件需要10分钟

我用相同大小的数组将函数移动到操场的sources文件夹中的一个单独的swift文件中,它立即完成了


我使用的代码来自您的问题(在func中),而不是优化版本。

当您在主文件中运行代码时,您可能启用了日志记录。这给代码增加了巨大的性能冲击

我在问题中试了你的代码作为函数
            ╭──────────────┬──────────────┬──────────────┬──────────────╮
            │       A      │       B      │       C      │       D      │
╭───────────╬══════════════╪══════════════╪══════════════╪══════════════╡
│       100 ║  0.000009426 │  0.000002401 │  0.000000571 │  0.000000550 │
│       200 ║  0.000003356 │  0.000002629 │  0.000000911 │  0.000000866 │
│       500 ║  0.000005610 │  0.000007288 │  0.000002236 │  0.000002012 │
│      1000 ║  0.000010638 │  0.000009181 │  0.000003905 │  0.000005030 │
│      2000 ║  0.000019377 │  0.000013316 │  0.000007116 │  0.000008732 │
│      5000 ║  0.000023430 │  0.000019304 │  0.000019809 │  0.000019092 │
│     10000 ║  0.000050463 │  0.000031669 │  0.000035121 │  0.000035420 │
│     20000 ║  0.000087040 │  0.000058664 │  0.000069300 │  0.000069456 │
│     50000 ║  0.000272357 │  0.000204213 │  0.000176962 │  0.000192996 │
│    100000 ║  0.000721436 │  0.000459551 │  0.000415024 │  0.000437604 │
│    200000 ║  0.001114534 │  0.000924621 │  0.000816374 │  0.000896202 │
│    500000 ║  0.002576687 │  0.002094998 │  0.001860833 │  0.002060462 │
│   1000000 ║  0.007063596 │  0.005924892 │  0.004319181 │  0.004869024 │
│   2000000 ║  0.014474969 │  0.013594134 │  0.008568550 │  0.009388957 │
│   5000000 ║  0.038348767 │  0.035136008 │  0.021276415 │  0.023855382 │
│  10000000 ║  0.081750925 │  0.078742713 │  0.043578664 │  0.047700495 │
│  20000000 ║  0.202616669 │  0.199960563 │  0.148141266 │  0.145360923 │
│  50000000 ║  0.567078563 │  0.552158644 │  0.370327555 │  0.397115294 │
│ 100000000 ║  1.136993625 │  1.101725386 │  0.713406642 │  0.740150322 │
└───────────╨──────────────┴──────────────┴──────────────┴──────────────┘