파이썬 깨알 상식

원종운·2020년 8월 31일

리스트 초기화

  1. nums.clear()
  2. del nums[:]
  3. nums[:] = []
  4. nums *= 0

퍼포먼스 : 4 > 1 > 2 == 3

주의 : nums = []는 리스트를 초기화시키는 것이 아니라, 기존의 리스트를 참조하지 않고 빈 리스트를 새로 참조하는 것.


리스트 복사

  1. dest = src[:]
    • 슬라이싱 이용
  2. dest = src.copy()
    • 리스트의 copy 메소드 이용
  3. dest = list(src)
    • 리스트 생성자 이용
  4. dest = copy.copy(dest)
    • copy 모듈의 copy 메소드 이용
  5. dest = copy.deepcopy(dest)
    • copy 모듈의 deepcopy 메소드 이용
  • 5번을 제외한 모든 방법은 얉은 복사이며, 5번의 방법만 깊은 복사를 지원합니다.
    • 복합 객체(중첩 객체)의 경우는 깊은 복사를 항상 고려하여야 합니다. 그렇지 않을 경우 원치않은 경우가 발생할 수 있습니다.

Passed by assignment

파이썬은 모든 것이 객체이기때문에 파라미터로 객체에 대한 참조를 넘겨주게 됩니다.
하지만, 이때 중요한 것은 객체에 대한 참조, 즉 자료의 참조이지, 변수에 대한 참조를 넘겨주는 것이 아닙니다.

그렇기 때문에 immutable한 자료형의 경우 값을 할당할 경우 immutable의 특성상 새로운 데이터에 대한 참조가 일어나게 되고, 더이상 함수가 호출됐을 당시 넘어왔던 자료의 참조는 사라지기 때문에, 원본 데이터에 영향을 끼치지 못합니다.

하지만 mutable한 자료형의 경우 값을 할당할 경우 immutable한 자료형과 동일하지만, 값을 할당하는 것이 아니라 변경할 경우는 함수가 호출됐을 당시 넘어왔던 자료의 참조가 동일하게 유지되므로, 원본 데이터에도 영향을 끼치게 됩니다.


Dictionary

  • 키는 해싱 가능한 즉, immutable한 객체는 모두 가능합니다.
  • 파이썬 3.6 이후 딕셔너리 메모리 사용량이 20% 감소하였습니다.
  • 대부분의 언어에서 Dictionary(HashMap, ...)는 입력 순서가 유지되지 않습니다.
  • 파이썬 3.6 이하에서는 Dictionary의 입력 순서가 유지되지 않습니다.
    • 입력 순서를 유지하려면 별도의 collections.OrderedDict()를 사용하였습니다.
    • 현재 호환성을 위해 남아있습니다.
  • 파이썬 3.7 이상에서의 Dictionary의 입력 순서가 유지됩니다.
    • 내부적으로 인덱스를 사용하여 유지합니다.

분할 상환 분석

시간 또는 메모리를 분석하는 알고리즘의 복잡도를 계산할 때, 알고리즘 전체를 보지 않고 최악의 경우만을 살펴보는 것은 지나치게 비관적이라는 이유로 분할 상환 분석 방법이 등장하는 계기가됐다

  • 함수의 동작을 설명할 때 중요한 분석 방법 중 하나
  • 분할 상환 분석이 유용한 대표적인 예는 '동적 배열의 삽입의 시간 복잡도'이다.
    • 동적 배열가 확보한 배열의 크기가 부족하여 더블링이 일어날 경우, 시간 복잡도는 O(n)이 될수도 있다. 하지만 이를 보고 '동적 배열의 삽입 시간 복잡도는 O(n)'이라고 하는 것은 지나치게 비관적이고 정확하지 않다.
profile
Java, Python, JavaScript Lover

0개의 댓글