[PYTHON] [x] 대신 operator.itemgetter (x)를 사용해야하는 이유는 무엇입니까?
PYTHON[x] 대신 operator.itemgetter (x)를 사용해야하는 이유는 무엇입니까?
여기에 좀 더 일반적인 질문이 있습니다 : 빌트인 연산자 모듈은 파이썬에서 어떤 상황에서 사용해야합니까?
최상위 대답은 operator.itemgetter (x)가 아마도 λ a : a [x]보다 "neater"하다고 주장합니다. 나는 그 반대가 사실이라고 느낀다.
실적과 같은 다른 혜택이 있습니까?
해결법
-
==============================
1.코드가 꽉 짜여진 루프에 있지 않으면 성능에 대해 걱정할 필요가 없습니다. 실제로 성능 문제입니다. 대신 자신의 의도를 가장 잘 나타내는 코드를 사용하십시오. 어떤 사람들은 람다를 좋아하고 일부는 itemgetter를 좋아합니다. 때로는 단지 맛의 문제 일뿐입니다.
코드가 꽉 짜여진 루프에 있지 않으면 성능에 대해 걱정할 필요가 없습니다. 실제로 성능 문제입니다. 대신 자신의 의도를 가장 잘 나타내는 코드를 사용하십시오. 어떤 사람들은 람다를 좋아하고 일부는 itemgetter를 좋아합니다. 때로는 단지 맛의 문제 일뿐입니다.
itemgetter는 예를 들어 한 번에 여러 요소를 가져와야하는 경우와 같이 더 강력합니다. 예 :
operator.itemgetter(1,3,5)
와 같다:
lambda s: (s[1], s[3], s[5])
-
==============================
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.공연. 그것은 큰 차이를 만들 수 있습니다. 상황에 따라 itemgetter를 사용하여 C 레벨에서 많은 작업을 수행 할 수 있습니다.
공연. 그것은 큰 차이를 만들 수 있습니다. 상황에 따라 itemgetter를 사용하여 C 레벨에서 많은 작업을 수행 할 수 있습니다.
나는 무엇이 더 명확한 지에 대한 주장이 당신이 가장 자주 사용하는 것에 달려 있으며 매우 주관적이라고 생각합니다.
-
==============================
4.일부 프로그래머는 람다 (lambda)를 이해하고 사용하지만, 컴퓨터 과학을 사용하지 않았고 개념에 대해 명확하지 않은 프로그래머 집단이 있습니다. 프로그래머에게 itemgetter ()는 사용자의 의도를 명확하게 할 수 있습니다. (나는 람다 (lambdas)를 쓰지 않으며, 코드에서 하나를 볼 때마다 코드의 내용을 처리하고 코드를 이해하는 데 약간의 시간이 걸린다.
일부 프로그래머는 람다 (lambda)를 이해하고 사용하지만, 컴퓨터 과학을 사용하지 않았고 개념에 대해 명확하지 않은 프로그래머 집단이 있습니다. 프로그래머에게 itemgetter ()는 사용자의 의도를 명확하게 할 수 있습니다. (나는 람다 (lambdas)를 쓰지 않으며, 코드에서 하나를 볼 때마다 코드의 내용을 처리하고 코드를 이해하는 데 약간의 시간이 걸린다.
다른 컴퓨터 과학 전문가를위한 코드 작성이 더 편한 경우 lambdas를 사용하십시오. 그러나 광범위한 사용자를 대상으로 코딩 할 경우 itemgetter ()를 사용하는 것이 좋습니다.
-
==============================
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.성능이 언급되었으므로 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
from https://stackoverflow.com/questions/11287207/why-should-i-use-operator-itemgetterx-instead-of-x by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] BeautifulSoup 및 lxml.html - 무엇을 선호합니까? [복제] (0) | 2018.10.26 |
---|---|
[PYTHON] OS가 파이썬에서 Vista인지 확인하는 방법? (0) | 2018.10.26 |
[PYTHON] django의 복합 기본 키 (0) | 2018.10.26 |
[PYTHON] 장고 : CSS가 작동하지 않습니다. (0) | 2018.10.26 |
[PYTHON] "next"매개 변수 인 redirect, django.contrib.auth.login (0) | 2018.10.26 |