Vous pouvez utiliser .lazy
stimuler aussi la performance un peu:
let numbers: [Int] = Array(0 ..< 2000)
let result: AnySequence = numbers
.lazy
.filter {
print("Calling filter for: \($0)")
return ($0 % 3) == 0
}
.prefix(5)
print(Array(result))
Cela appellera la fonction filter
seulement pour les 15 premières valeurs (jusqu'à ce qu'il trouve 5 qui passent le filtre).
Maintenant vous pouvez vous concentrer sur l'amélioration des performances du filter
lui-même. Par exemple. en mettant en cache des valeurs. Vous n'avez pas à le faire, mais si certaines valeurs ne cessent de se répéter, cela peut améliorer considérablement les performances.
let numbers: [Int] = Array(0 ..< 2000)
var filterCache: [Int: Bool] = [:]
let result: AnySequence = numbers
.lazy
.filter {
if let cachedResult = filterCache[$0] {
return cachedResult
}
print("Calling filter for: \($0)")
let result = (($0 % 3) == 0)
filterCache[$0] = result
return result
}
.prefix(5)
print(Array(result))
Vous pouvez appliquer cette méthode directement à votre fonction.
Notez également que pour améliorer les performances, vous devez soit:
sauver ((row.value as? String)?.lowercased())!
dans une variable locale, car il est exécuté plusieurs fois
simplifier l'expression à l'aide des options:
let result: AnySequence = providerArray
.lazy
.filter {
$0.range(of: row.value as! String, options: [.caseInsensitive]) != nil
}
.prefix(5)
Encore un hommage aux boucles explicites, soignées! :) Un cas de coin, mais vous pourriez envisager de réserver une capacité qui est le minimum de 'limite' et le' underestimatedCount' de la séquence (par exemple 'result.reserveCapacity (Swift.min (limit, underestimatedCount))') dans cas, un utilisateur (abusivement) appelle cela avec une énorme limite sur une séquence beaucoup plus petite. – dfri
@dfri: Je ne sais pas si c'est mieux. 'underestimatedCount' est nul pour toutes les séquences dont la longueur n'est pas connue a priori, donc cela ne fonctionnerait que pour les tableaux ou autres' RandomAccessCollection's. –
Ah oui, bien sûr. Alors peut-être seulement dans le cas où l'extension devrait être faite à 'Collection' plutôt qu'à' Sequence' :) Y a-t-il une raison particulière d'utiliser l'extension plus générale de 'Sequence' ici plutôt que' Collection'? (Puisque nous retournons un type qui est plus spécifique comme 'Collection' et pas seulement' Sequence'). Ninja-edit: mais encore une fois le [std lib 'filter' de' Sequence'] (https://github.com/apple/swift/blob/master/stdlib/public/core/Sequence.swift#L846) ... – dfri