본문 바로가기
[개발자 로드맵]/파이썬

파이썬 append(), extend(), += 성능적으로 어느 것이 좋을까?

by Ramrider 2023. 9. 25.
728x90
반응형
#append 메소드로 구현한 평탄화 함수

def flattern(originlist):
    output =[]
    for index in originlist:
        if type(index) == list:
            for i in index:
                if type(i) == list:
                    for si in i:
                        output.append(si)
                else:
                    output.append(i)
        else:
            output.append(index)
    return output

example = [[1, 2, 3], [4, [5, 6]], 7, [8, 9]]
print(flattern(example))

 

평탄화 함수를 구현한 예인데 위처럼 ouput에 append 메서드를 활용하여 요소를 더할 수 있다. 아니면 아래 처럼 +=로 평탄화를 구현할 수도 있다(extend는 생략)

 

# +연산자를 이용한 평탄화 함수, 재귀함수가 특징

def flattern(originlist):
    output = []
    for index in originlist:
        if type(index) == list:
            output += flattern(index)
        else:
            output.append(index)
    return output

example = [[1, 2, 3], [4, [5, 6]], 7, [8, 9]]
print(flattern(example))

 

궁금한 점이 생긴다. 둘다 결과는 같은데 어느 것이 성능이 더 좋을까? 우리가 개발을 할때 이 두개의 결과 같다고 별 생각 없이 사용해도 괜찮은 것일까?

 

1. 기본적으로 append()와 extend() 메서드는 파괴적 조작, +=는 비퐈괴적 조작이다.

 

2. 파괴적 조작은 원본에 직접 조작하니 메모리 추가 사용이 없고, 비파괴적 조작은 원본을 유지하고 복사본을 만드니 메모리를 추가적으로 사용하게 되어 대부분의 조작은 파괴적 조작이 메모리+성능 적으로 훨씬 좋다.

 

3. 따라서 성능을 목표로 한다면 append()와 extend()를 사용하는 쪽이 좋다.

 

4. 그러나 위의 평탄화 조작은 일반적으로 사용되는 규모가 작고 한 프로그램에서도 많이 사용되는 기능이 아니므로 어떤 방법을 사용해도 괜찮다.

 

5. 현대적인 프로그램은 속도를 빠르게 만들고자 여러 대의 컴퓨터/ 프로세스/ 쓰레드가 한꺼번에 작동하는 "병렬화"를 수행하게 되는데, 이 때 파괴적 조작은 이러한 병렬화에 제약이 있을 수 있다.

 

6. 그래서 extend()와 +=를 사용하는 방법 두 가지 모두 생각해 낼 수 있도록 하는 것이 좋다.

728x90
반응형

댓글