develop

LazySequence 본문

iOS

LazySequence

pikachu987 2021. 2. 2. 20:59
반응형
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를 잘 사용하면 연산횟수가 엄청나게 줄어들게 된다.
반응형
Comments