보통은 list comprehension이 반복문보다 처리 속도가 빠르다고 알고 있다. 그런데 그렇지 않은 경우도 존재한다.
다음과 같은 경우를 예로 살펴 보자.
어떤 pattern과 text를 입력 받아, 해당 pattern이 text에 포함되어 있는지 검사하는 코드이다.
결과로 pattern이 시작되는 text의 index를 반환한다.
def read_input():
return (input().rstrip(), input().rstrip())
def print_occurrences(output):
print(' '.join(map(str, output)))
def get_occurrences(pattern, text):
return [
i
for i in range(len(text) - len(pattern) + 1)
if text[i:i + len(pattern)] == pattern
]
if __name__ == '__main__':
print_occurrences(get_occurrences(*read_input()))
"""
Input:
aba
abacaba
Output:
0 4
"""
위 get_occurrences 함수를 보면 return 값으로 list comprehension을 수행한 결과를 반환한다.
이 부분을 for문으로 바꿔보자.
def read_input():
return input().rstrip(), input().rstrip()
def print_occurrences(output):
print(' '.join(map(str, output)))
def get_occurrences(pattern, text):
pattern_length = len(pattern)
text_length = len(text)
occurrences = []
for i in range(text_length - pattern_length + 1):
if text[i:i + pattern_length] == pattern:
occurrences.append(i)
return occurrences
if __name__ == '__main__':
print_occurrences(get_occurrences(*read_input()))
분명 추가적으로 변수들을 선언하고 for문을 추가하면서 코드의 길이는 더 늘어났다.
하지만 두 코드의 실행 속도를 비교해보면 반복문을 사용한 두 번째 코드가 더 빠르게 나타난다.
"""
Input:
lNoYhXmlwOscxnkTWjsyNJNhgvzMFbxFnbiWuBAGjZQlCRQHjTUX
ZtonpqnFzlpvUKZrBbRlNoYhXmlwOscxnkTWjsyNJNhgvzMFbxFnbiWuBAGjZQlCRQHjTUXxtHmTxoLuMbRYsvSpxhtrlvABBlFYmndFzHypOmJyFxjHEPlNoYhXmlwOscxnkTWjsyNJNhgvzMFbxFnbiWuBAGjZQlCRQHjTUXbDiEAvtPlNoYhXmlwOscxnkTWjsyNJNhgvzMFbxFnbiWuBAGjZQlCRQHjTUXRRNoBCUMQVOlNoYhXmlwOscxnkTWjsyNJNhgvzMFbxFnbiWuBAGjZQlCRQHjTUXRLKlNoYhXmlwOscxnkTWjsyNJNhgvzMFbxFnbiWuBAGjZQlCRQHjTUXAYPDKWtVpShhclNoYhXmlwOscxnkTWjsyNJNhgvzMFbxFnbiWuBAGjZQlCRQHjTUXOJlUlNoYhXmlwOscxnkTWjsyNJNhgvzMFbxFnbiWuBAGjZQlCRQHjTUXglmlNoYhXmlwOscxnkTWjsyNJNhgvzMFbxFnbiWuBAGjZQlCRQHjTUXuaOibGlVrwghvNTgLfltIbEdBlgjelFjQkBeFrdEV
Output:
19 118 178 241 296 361 417 472
"""
"""
With list comprehension: 7.761297702789307 s
With For loop: 9.038793802261353 s
"""
이런 결과가 나타나는 이유를 자세히 뜯어보면 다음과 같다.
1. pattern 및 text length를 변수로 저장해 반복 계산 방지
2. occurrences 리스트에 직접 append함으로써 list comprehension을 생성하기 위한 추가 메모리 할당 방지
3. 빈 occurrences 리스트를 반복문 이전에 생성하여 iteration마다 element 반복 추가 방지
input에 따라 다르지만, 위 예시와 같이 서로 2초 이상 실행 속도의 차이가 나타나기도 한다.
따라서 단순히 list comprehension만을 추구할 게 아니라, 어떤 쪽이 더 효율적일지 세심한 고려가 필요할 것 같다.
반응형
'공부하며 성장하기 > 파이썬 Python' 카테고리의 다른 글
[파이썬 코딩의 기술] 클래스 합성으로 복잡한 내포 관계 정리하기 (0) | 2022.07.02 |
---|---|
🏆 2021 노마드 어워즈 후기 (0) | 2021.12.30 |
[파이썬 코딩의 기술] 03/ 협업의 확장 (4) | 2021.07.05 |
[파이썬 코딩의 기술] 02/ 협업의 미덕 (0) | 2021.07.04 |
[파이썬 코딩의 기술] 01/ 협업의 기초 (0) | 2021.07.04 |