나는 알고리즘의 속도를 향상 시키려고 노력하고 있는데, 어떤 연산이 호출되는지보고 난 후에는 속도를 늦추는 것이 어려워지고있다. Python의 deepcopy()가 범인이 될 수 있는지, 아니면 내 코드를 좀 더 자세히 살펴 봐야하는지 궁금합니다.파이썬의 deepcopy()의 런타임 복잡도는 얼마입니까?
답변
(예를 들어, 딕셔너리의 키와 값 객체의 멤버 변수, ...) 그들과 않는 두 가지 :
이미있는 경우 개체의 ID를 인덱스memo
DICT
- 하지
두 번째는 단순한 객체에 대한 O (1)입니다 참조하십시오. 복합 객체의 경우 동일한 루틴에서 처리하므로 모든 n 트리의 객체는 O (n)입니다. dict에서 객체를 찾는 첫 번째 부분은 O(1) on average, but O(n) amortized worst case입니다.
기껏해야 평균적으로 deepcopy
은 선형입니다. memo
에 사용 된 키는 메모리 위치와 같은 id()
값입니다. 따라서 키 공간 (위의 "평균"부분)에 무작위로 분포하지 않으며 최악의 경우 최대 까지 동작합니다. . 실제 사용에서 일부 성능 저하를 관찰했지만, 대부분 선형으로 동작했습니다.
이것은 복잡성 부분이지만 상수는 크고 deepcopy
is anything but cheap이며 큰 문제가 될 수 있습니다. 유일한 확실한 방법은 프로파일 러를 사용하는 것입니다. FWIW, 나는 현재 실행 시간의 98 %를 deepcopy
에 보내는 아주 느린 코드를 다시 작성하고 있습니다.
deepcopy()
의 복잡도는 복사되는 개체의 크기 (요소 수/자식 수)에 따라 다릅니다.
알고리즘의 입력이 복사되는 객체의 크기에 영향을주지 않으면 각 호출의 실행 시간이 상대적으로 고정되어 있으므로 복잡성을 결정할 때 deeopcopy()
의 호출을 O(1)
으로 간주해야합니다.
(알고리즘의 입력이 복사되는 물체의 크기에 영향이있는 경우, 당신은. 그런 다음 알고리즘의 복잡성을 평가하는 방법을 자세히 설명해야합니다.)
이론적 인 복잡성을 결정하기보다는 실제 성능 평가를 찾고 있다면 코드를 게시해야합니다. – cheeken
그건 말도 안돼, 미안. 'deepcopy '가하는 본질은 깊이 복사 된 객체의 참조 그래프에서 모든 (하위) 객체의 수에 최소한 * 선형 복잡성을 가져야한다는 것을 분명하게 알 수 있습니다. –
을 무엇 deepcopy
을 사용하고 계십니까? 이름에서 알 수 있듯이 deepcopy
은 개체와 모든 하위 개체를 반복적으로 복사하므로 복사중인 개체의 크기에 비례하여 시간이 걸릴 것입니다. (순환 참조를 처리하기 위해 약간의 오버 헤드가 있음)
모든 것을 복사하려고한다면 실제로 속도를 높이는 방법이 없습니다. 모든 것을 복사해야합니다.
한 가지 질문 만하면 모든 것을 복사해야합니까, 아니면 구조의 일부만 복사 할 수 있습니까? (당신도 할 수 있습니다),이 참조 된 개체의 트리의 모든 개체를 통과 코드를 보면
- 1. 이 함수의 계산 복잡도는 얼마입니까?
- 2. TreeSet 반복의 시간 복잡도는 얼마입니까?
- 3. java.util.HashMap 클래스의 keySet() 메소드의 시간 복잡도는 얼마입니까?
- 4. FP 성장 알고리즘의 시간과 공간의 복잡도는 얼마입니까?
- 5. Java의 LinkedList에서 size() 호출의 시간 복잡도는 얼마입니까?
- 6. 클로저에서 카운트 기능의 시간 복잡도는 얼마입니까?
- 7. java.util.TreeSet의 tailSet 조작의 시간 복잡도는 얼마입니까?
- 8. java에서 HashMap.containsKey()의 시간 복잡도는 얼마입니까?
- 9. 파이썬의 런타임 통계
- 10. Haskell GHC : N 생성자와 일치하는 패턴의 시간 복잡도는 얼마입니까?
- 11. 지시 비순환 단어 그래프에서 조회의 시간 복잡도는 얼마입니까?
- 12. 시간 복잡도는
- 13. 파이썬의 목록과 사전에는 제한된 용량이 있습니까? 그렇다면 얼마입니까?
- 14. 아래에 작성한 선형 검색 c 코드의 시간 복잡도는 얼마입니까? 내 코드가 좋은지 나쁜지?
- 15. HashSet <T> (IEqualityComparer <T>)의 조회 시간 복잡도는 얼마입니까?
- 16. 시간 복잡도는 + n은 O (L)
- 17. 아래 코드의 복잡도는 어느 정도입니까?
- 18. 이 함수의 시간 복잡도는 얼마나됩니까?
- 19. 파이썬의 사전은 C++에서지도로 볼 수 있습니까
- 20. 파이썬의 동적 변수 이름
- 21. 스칼라와 파이썬의 패스
- 22. 최대 재귀 적으로 찾는 시간 복잡도는 무엇입니까
- 23. 문자 배열 초기화의 시간 복잡도는 어떻게됩니까?
- 24. HTML DOM 조회의 시간 복잡도는 무엇입니까
- 25. 합계는 얼마입니까?
- 26. 파이썬의 Sum()
- 27. 파이썬의 Memcache
- 28. 파이썬의 re.sub()
- 29. 파이썬의 인쇄에
- 30. 파이썬의 xml.dom.minidom
'deepcopy'의 복잡성은 이름에서 알 수 있듯이 인수에서 도달 할 수있는 값의 총량에 비례합니다. 그것은 병적 인 경우의 대부분의 힙일 수 있습니다. –
@BasileStarynkevitch : 답변을 답으로 게시하십시오. –