복붙노트

[PYTHON] [x] 대신 operator.itemgetter (x)를 사용해야하는 이유는 무엇입니까?

PYTHON

[x] 대신 operator.itemgetter (x)를 사용해야하는 이유는 무엇입니까?

여기에 좀 더 일반적인 질문이 있습니다 : 빌트인 연산자 모듈은 파이썬에서 어떤 상황에서 사용해야합니까?

최상위 대답은 operator.itemgetter (x)가 아마도 λ a : a [x]보다 "neater"하다고 주장합니다. 나는 그 반대가 사실이라고 느낀다.

실적과 같은 다른 혜택이 있습니까?

해결법

  1. ==============================

    1.코드가 꽉 짜여진 루프에 있지 않으면 성능에 대해 걱정할 필요가 없습니다. 실제로 성능 문제입니다. 대신 자신의 의도를 가장 잘 나타내는 코드를 사용하십시오. 어떤 사람들은 람다를 좋아하고 일부는 itemgetter를 좋아합니다. 때로는 단지 맛의 문제 일뿐입니다.

    코드가 꽉 짜여진 루프에 있지 않으면 성능에 대해 걱정할 필요가 없습니다. 실제로 성능 문제입니다. 대신 자신의 의도를 가장 잘 나타내는 코드를 사용하십시오. 어떤 사람들은 람다를 좋아하고 일부는 itemgetter를 좋아합니다. 때로는 단지 맛의 문제 일뿐입니다.

    itemgetter는 예를 들어 한 번에 여러 요소를 가져와야하는 경우와 같이 더 강력합니다. 예 :

    operator.itemgetter(1,3,5)
    

    와 같다:

    lambda s: (s[1], s[3], s[5])
    
  2. ==============================

    2.어떤 상황에서는 이점이 있습니다. 좋은 예가 있습니다.

    어떤 상황에서는 이점이 있습니다. 좋은 예가 있습니다.

    >>> data = [('a',3),('b',2),('c',1)]
    >>> from operator import itemgetter
    >>> sorted(data, key=itemgetter(1))
    [('c', 1), ('b', 2), ('a', 3)]
    

    이 itemgetter의 사용은 모든 작업이 C면에서 유지됨에 따라 모든 것이 명확 해지면서 더 빠르기 때문에 훌륭합니다.

    >>> sorted(data, key=lambda x:x[1])
    [('c', 1), ('b', 2), ('a', 3)]
    

    람다를 사용하는 것은 명확하지 않으며, 느려지므로 람다를 사용하지 않는 것이 바람직합니다. 예 : 목록 내재는 람다가있는 맵을 사용하는 것보다 선호됩니다.

  3. ==============================

    3.공연. 그것은 큰 차이를 만들 수 있습니다. 상황에 따라 itemgetter를 사용하여 C 레벨에서 많은 작업을 수행 할 수 있습니다.

    공연. 그것은 큰 차이를 만들 수 있습니다. 상황에 따라 itemgetter를 사용하여 C 레벨에서 많은 작업을 수행 할 수 있습니다.

    나는 무엇이 더 명확한 지에 대한 주장이 당신이 가장 자주 사용하는 것에 달려 있으며 매우 주관적이라고 생각합니다.

  4. ==============================

    4.일부 프로그래머는 람다 (lambda)를 이해하고 사용하지만, 컴퓨터 과학을 사용하지 않았고 개념에 대해 명확하지 않은 프로그래머 집단이 있습니다. 프로그래머에게 itemgetter ()는 사용자의 의도를 명확하게 할 수 있습니다. (나는 람다 (lambdas)를 쓰지 않으며, 코드에서 하나를 볼 때마다 코드의 내용을 처리하고 코드를 이해하는 데 약간의 시간이 걸린다.

    일부 프로그래머는 람다 (lambda)를 이해하고 사용하지만, 컴퓨터 과학을 사용하지 않았고 개념에 대해 명확하지 않은 프로그래머 집단이 있습니다. 프로그래머에게 itemgetter ()는 사용자의 의도를 명확하게 할 수 있습니다. (나는 람다 (lambdas)를 쓰지 않으며, 코드에서 하나를 볼 때마다 코드의 내용을 처리하고 코드를 이해하는 데 약간의 시간이 걸린다.

    다른 컴퓨터 과학 전문가를위한 코드 작성이 더 편한 경우 lambdas를 사용하십시오. 그러나 광범위한 사용자를 대상으로 코딩 할 경우 itemgetter ()를 사용하는 것이 좋습니다.

  5. ==============================

    5.기존 응답에 추가하려면 itemgetter가 picklable이고 lambda는 그렇지 않습니다. 함수를 저장하거나 프로세스간에 전달해야하는 경우 (일반적으로 큰 객체의 일부로)이 작업이 중요합니다. 다음 예제에서 itemgetter를 lambda로 바꾸면 PicklingError가됩니다.

    기존 응답에 추가하려면 itemgetter가 picklable이고 lambda는 그렇지 않습니다. 함수를 저장하거나 프로세스간에 전달해야하는 경우 (일반적으로 큰 객체의 일부로)이 작업이 중요합니다. 다음 예제에서 itemgetter를 lambda로 바꾸면 PicklingError가됩니다.

    from operator import itemgetter
    
    def sort_by_key(sequence, key):
        return sorted(sequence, key=key)
    
    if __name__ == "__main__":
        from multiprocessing import Pool
    
        items = [([(1,2),(4,1)], itemgetter(1)),
                 ([(5,3),(2,7)], itemgetter(0))]
    
        with Pool(5) as p:
            result = p.starmap(sort_by_key, items)
        print(result)
    
  6. ==============================

    6.성능이 언급되었으므로 operator.itemgetter와 lambda 두 가지 방법을 비교했으며 작은 목록에서는 operator.itemgetter가 람다를 10 % 능가하는 것으로 나타났습니다. 저는 개인적으로 itemgetter 메서드를 사용합니다. 정렬하는 동안 주로 사용하기 때문에 키워드로 사용되었습니다.

    성능이 언급되었으므로 operator.itemgetter와 lambda 두 가지 방법을 비교했으며 작은 목록에서는 operator.itemgetter가 람다를 10 % 능가하는 것으로 나타났습니다. 저는 개인적으로 itemgetter 메서드를 사용합니다. 정렬하는 동안 주로 사용하기 때문에 키워드로 사용되었습니다.

    import operator
    import timeit
    
    x = [[12, 'tall', 'blue', 1],
    [2, 'short', 'red', 9],
    [4, 'tall', 'blue', 13]]
    
    
    def sortOperator():
        x.sort(key=operator.itemgetter(1, 2))
    
    def sortLambda():
        x.sort(key=lambda x:(x[1], x[2]))
    
    
    if __name__ == "__main__":
        print(timeit.timeit(stmt="sortOperator()", setup="from __main__ import sortOperator", number=10**7))
        print(timeit.timeit(stmt="sortLambda()", setup="from __main__ import sortLambda", number=10**7))    
    
    >>Tuple: 9.79s, Single: 8.835s
    >>Tuple: 11.12s, Single: 9.26s
    
  7. from https://stackoverflow.com/questions/11287207/why-should-i-use-operator-itemgetterx-instead-of-x by cc-by-sa and MIT license