develop
LazySequence 본문
반응형
let example = [1,2,3,4,5,6].filter { (value) -> Bool in
print("filter: \(value)")
return value % 2 == 0
}
let example1 = [1,2,3,4,5,6].lazy.filter { (value) -> Bool in
print("lazy filter: \(value)")
return value % 2 == 0
}
filter: 1
filter: 2
filter: 3
filter: 4
filter: 5
filter: 6
lazy를 사용하지 않은 example은 filter가 동작이 된다.
lazy를 사용한 example1는 lazy의 뜻에 알맞게 동작이 되지 않는다.
let example = [1,2,3,4,5,6].filter { (value) -> Bool in
print("filter: \(value)")
return value % 2 == 0
}
print("example: \(example)")
let example1 = [1,2,3,4,5,6].lazy.filter { (value) -> Bool in
print("lazy filter: \(value)")
return value % 2 == 0
}
print("example1: \(example1)")
filter: 1
filter: 2
filter: 3
filter: 4
filter: 5
filter: 6
example: [2, 4, 6]
example1: LazyFilterSequence<Array<Int>>(_base: [1, 2, 3, 4, 5, 6], _predicate: (Function))
example1의 filter가 동작되지 않았다.
그리고 LazyFilterSequence<Base> 구조체형태로 나왔다.
LazySequence구조체는 LazySequence<Base>, LazyFilterSequence<Base>, LazyMapSequence<Base, Element>, LazyDropWhileSequence<Base>, LazyPrefixWhileSequence<Base> 가 있다.
let example = [1,2,3,4,5,6].filter { (value) -> Bool in
print("filter: \(value)")
return value % 2 == 0
}
print("example: \(example.first)")
let example1 = [1,2,3,4,5,6].lazy.filter { (value) -> Bool in
print("lazy filter: \(value)")
return value % 2 == 0
}
print("example1: \(example1.first)")
filter: 1
filter: 2
filter: 3
filter: 4
filter: 5
filter: 6
example: Optional(2)
lazy filter: 1
lazy filter: 2
example1: Optional(2)
값을 뽑을 때 filter의 로직이 실행되고 연산 횟수가 많이 줄어들었다.
let example = [1,2,3,4,5,6].filter { (value) -> Bool in
print("filter: \(value)")
return value % 2 == 0
}.count
print("example: \(example)")
let example1 = [1,2,3,4,5,6].lazy.filter { (value) -> Bool in
print("lazy filter: \(value)")
return value % 2 == 0
}.count
print("example1: \(example1)")
filter: 1
filter: 2
filter: 3
filter: 4
filter: 5
filter: 6
example: 3
lazy filter: 1
lazy filter: 2
lazy filter: 3
lazy filter: 4
lazy filter: 5
lazy filter: 6
example1: 3
count를 사용하면 모든 값을 체크해야 해서 example와 연산이 동일하게 나오게 된다.
let example = [1,2,3,4,5,6].filter { (value) -> Bool in
print("filter: \(value)")
return value % 2 == 0
}.map{ (value) -> Int in
print("map: \(value)")
return value * 2
}.count
print("example: \(example)")
let example1 = [1,2,3,4,5,6].lazy.filter { (value) -> Bool in
print("lazy filter: \(value)")
return value % 2 == 0
}.map{ (value) -> Int in
print("lazy map: \(value)")
return value * 2
}.count
print("example1: \(example1)")
filter: 1
filter: 2
filter: 3
filter: 4
filter: 5
filter: 6
map: 2
map: 4
map: 6
example: 3
lazy filter: 1
lazy filter: 2
lazy filter: 3
lazy filter: 4
lazy filter: 5
lazy filter: 6
example1: 3
filter후에 map을 사용하게 되면 lazy를 사용하였을때 map의 연산이 빠지게 된다.
map이 count에 영향이 없기 때문이다.
- 항상 lazy를 사용했을때 연산이 줄고 속도가 빠른게 아니고 원하는 값이 무엇인지에 따라 연산이 달라지게 된다.
- 많은 양의 데이터에서 lazy를 잘 사용하면 연산횟수가 엄청나게 줄어들게 된다.
반응형
'iOS' 카테고리의 다른 글
Thread (0) | 2021.02.04 |
---|---|
DispatchWorkItem (0) | 2021.02.03 |
Property(Stored Property, Lazy Property, Computed Property, Property Observers, Type Property) (0) | 2021.02.01 |
KVC KVO (Key-Value Coding, Key-Value Observing) (0) | 2021.01.31 |
Reference Equal 참조 비교하기 (0) | 2021.01.31 |
Comments