这里有两个相似的Levenshtein距离算法。
Swift实现: https://gist.github.com/bgreenlee/52d93a1d8fa1b8c1f38b Objective-C实现: https://gist.github.com/boratlibre/1593632 Swift的实现比Objective-C实现慢得多。我花了几个小时来优化它,但是...似乎Swift数组和字符串操作不像objC那样快。
在2000个随机字符串的计算中,Swift的实现比ObjC慢了约100倍。
说实话,我不知道哪里出了问题,因为即使是这部分Swift代码也是这样。
Swift实现: https://gist.github.com/bgreenlee/52d93a1d8fa1b8c1f38b Objective-C实现: https://gist.github.com/boratlibre/1593632 Swift的实现比Objective-C实现慢得多。我花了几个小时来优化它,但是...似乎Swift数组和字符串操作不像objC那样快。
在2000个随机字符串的计算中,Swift的实现比ObjC慢了约100倍。
说实话,我不知道哪里出了问题,因为即使是这部分Swift代码也是这样。
func levenshtein(aStr: String, bStr: String) -> Int {
// create character arrays
let a = Array(aStr)
let b = Array(bStr)
...
相比于使用Objective C
的整个算法,它几乎慢了几倍。
有人知道如何加速swift
计算吗?
提前感谢您!
附加说明
在所有建议的改进后,Swift代码看起来像这样。在发布配置中,它比ObjC慢4倍。
import Foundation
class Array2D {
var cols:Int, rows:Int
var matrix:UnsafeMutablePointer<Int>
init(cols:Int, rows:Int) {
self.cols = cols
self.rows = rows
matrix = UnsafeMutablePointer<Int>(malloc(UInt(cols * rows) * UInt(sizeof(Int))))
for i in 0...cols*rows {
matrix[i] = 0
}
}
subscript(col:Int, row:Int) -> Int {
get {
return matrix[cols * row + col] as Int
}
set {
matrix[cols*row+col] = newValue
}
}
func colCount() -> Int {
return self.cols
}
func rowCount() -> Int {
return self.rows
}
}
extension String {
func levenshteinDistanceFromStringSwift(comparingString: NSString) -> Int {
let aStr = self
let bStr = comparingString
// let a = Array(aStr.unicodeScalars)
// let b = Array(bStr.unicodeScalars)
let a:NSString = aStr
let b:NSString = bStr
var dist = Array2D(cols: a.length + 1, rows: b.length + 1)
for i in 1...a.length {
dist[i, 0] = i
}
for j in 1...b.length {
dist[0, j] = j
}
for i in 1...a.length {
for j in 1...b.length {
if a.characterAtIndex(i-1) == b.characterAtIndex(j-1) {
dist[i, j] = dist[i-1, j-1] // noop
} else {
dist[i, j] = min(
dist[i-1, j] + 1, // deletion
dist[i, j-1] + 1, // insertion
dist[i-1, j-1] + 1 // substitution
)
}
}
}
return dist[a.length, b.length]
}
func levenshteinDistanceFromStringObjC(comparingString: String) -> Int {
let aStr = self
let bStr = comparingString
//It is really strange, but I should link Objective-C coz dramatic slow swift performance
return aStr.compareWithWord(bStr, matchGain: 0, missingCost: 1)
}
}
使用malloc和NSString导致最后速度降低4倍?还有人需要Swift吗?