PYTHON: 시간 복잡도 측면에서 효율적인 코드 작성하기

2024. 10. 3. 12:51Troubleshooting

 

01 시간 복잡도를 비교 점검하라.


문제URL: 대충 만든 자판

 

 

문제 발견: target 단어에서 'AABB'와 같이 중복된 단어가 나오면 해당 과정을 반복하는 문제가 있음.

해결 방법: targets리스트를 한번에 dict형식으로 정리해두면 중복단어에 대해 빨리 처리할 수 있음.

 

 

단, 입력 문자열의 길이와 호출 빈도에 따라 두 방법의 효율성이 달라질 수 있음. 짧은 문자열을 자주 사용하는 경우 첫 번째 방법이 유리할 수 있지만, 여러 번의 입력 문자열에 대해 반복적으로 조회해야 할 경우 두 번째 방법이 더 효율적일 것이라 생각되니 상황에 따라 판단한다.

 

▶ 코드를 완성했을 때 어떻게하면 불필요한 반복 = 중복 체크를 줄일 수 있을지 고민해보자.

 

02 인사이트


1. 제너레이터 표현식을 정확히 알고 사용해야 해당 에러 문구를 피할 수 있다.

max() arg is an empty sequence.

 

<제너레이터의 정의와 특징>

a. 정의

- 이터레이터를 생성하는 특별한 함수이다. yield 키워드를 사용하여 값을 하나씩 반환한다.

b. 특징

- 지연 평가: 제너레이터는 값을 요청할 때마다 하나씩 생성하므로 메모리를 효율적으로 사용한다.

- 상태 유지: 제너레이터는 이전 상태를 기억하고 다음 호출 시 그 상태에서 계속 실행된다.

- 무한 시퀀스: 제너레이터를 사용하면 무한한 수열을 생성할 수 있다.

def count_up_to(n):
    count = 1
    while count <= n:
        yield count
        count += 1

gen = count_up_to(5)
for number in gen:
    print(number)  # 출력: 1, 2, 3, 4, 5

 

<제너레이터 표현식과 리스트 컴프리헨션>

a. 제너레이터 표현식은 한 번에 모든 값을 메모리에 저장하지 않고, 각 값이 필요할 때마다 계산하여 반환한다.

b. 리스트 컴프리헨션의 한 번에 모든 값을 메모리에 저장하므로, 메모리를 더 많이 사용한다.

c. 이러한 차이로 인해 제너레이터는 큰 데이터셋을 처리할 때 유용하며, 리스트 컴프리헨션은 작은 데이터셋을 간편하게 처리할 때 유용하다.

squared_gen = (x * x for x in range(5))
for value in squared_gen:
    print(value)  # 출력: 0, 1, 4, 9, 16

 

2. 내장 함수의 이름이 다른 변수로 덮어 씌워졌을 때 볼 수 있는 에러 문구이다.

'str' object is not callable.

 

3. Python에서는 리스트에서 특정 값을 모두 제거하는 데 remove()와 filter() 등의 방법이 있다.

 

3. Python에서 len은 SQL에서 LENGTH함수와 같다.

SELECT tweet_id
FROM Tweets
WHERE LENGTH(content) > 15;