Arrays 快速性能的xy阵列
我有两个带浮点数的大数组(数千个值),希望将它们组合成一个xy点数组,以便进一步处理,例如绘图 因此,现在在Xcode游乐场,我正在做以下工作: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
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)
(我冒昧地将structXYPoint
称为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)
(我冒昧地将structXYPoint
称为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 │
└───────────╨──────────────┴──────────────┴──────────────┴──────────────┘