[python] enumerate과 zip을 사용한 for문은 느릴까?

효다몬·2022년 7월 10일
0

쉬운 문제들만 풀때는 몰랐는데 최근 코딩테스트를 준비하며 더 고난도 문제를 풀다보니, 시간 제한에 걸려 틀리는 일이 많아졌다.
그러다보니 수행 시간에 굉장히 민감해졌다...

문득 평소에 Python으로 문제를 풀 때 애용하던 enumerate과 zip이 그냥 for문을 사용하는 것보다 더 느린지, 느리다면 얼마나 느린지 궁금해졌다.


Enumerate란?

먼저 enumerate를 모르는 사람이 있을 수 있으므로 간단히 설명해보자면, for문을 통해 반복할 때 index와 원소를 동시에 접근할 수 있는 기능이다.

보통 Python에서 for문은 아래 두 가지 방법으로 사용할 수 있다.

arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 1 : range를 통해 index로 접근
for i in range(10) :
    print(arr[i])
# 2 : 배열에 있는 원소로 차례대로 접근
for a in arr :
	print(a)

첫 번째는 range를 통해 index로 접근할 수 있고, 두 번째는 배열에 있는 원소를 차례대로 접근할 수 있다.
enumerate를 사용하면 이 두 가지를 동시에 접근할 수 있다.

for i, a in enumerate(arr) :
	print(arr[i])
    print(a)

알고리즘 문제를 풀다보면 반복문을 돌며 index와 원소를 둘 다 사용해야 하는 경우가 많은데, 이때 enumerate를 사용하면 훨씬 쉽고 가독성이 좋게 문제를 풀이할 수 있다.


하지만 개발이라는 것이 인간에게 쉽다면 컴퓨터에게 어려운 것이니, 실행 시간이 조금 더 걸릴 것 같다고 생각이 들었고 time 모듈을 통해 시간을 측정해보았다.

100,000,000개의 숫자가 들어 있는 arr배열을 모두 돌며, sum이라는 변수에 값을 더해가는 코드이다.
총 100,000,000번의 연산을 수행한다.

import time
from datetime import timedelta

print("enumerate 사용")
start = time.process_time()

arr = [i for i in range(100000000)]
sum = 0

for i, num in enumerate(arr):
    sum += num

end = time.process_time()

print("Time elapsed: ", end - start)

print("------------------")
print("enumerate 사용 X")
start = time.process_time()

arr = [i for i in range(100000000)]
sum = 0

for num in arr:
    sum += num

end = time.process_time()

print("Time elapsed: ", end - start)

시간을 측정해본 결과 1억번을 수행했을 때, 약 2.7초 차이로 약 1.2배 차이가 난다.


zip 이란?

Python의 zip은 여러 개의 반복가능한(iterable) 객체들을 묶어 한 번에 사용할 수 있도록 해주는 함수이다.
사용 방법은 다음과 같다.

arr1 = ['A', 'B', 'C', 'D', 'E']
arr2 = [1, 2, 3, 4, 5]

for x, y in zip(arr1, arr2) :
    print(arr[i])

zip 또한 알고리즘 문제를 풀면서 사용한다면 편리한 점이 정말 많다.


zip은 시간이 얼마나 걸릴까?

시간을 측정해보기 위해 0 부터 100,000,000까지 저장되어 있는 배열과 100,000,000부터 0까지 저장되어 있는 배열을 생성해 반복문을 돌며 더해보는 코드를 작성했다.

print("zip 사용")

start = time.process_time()

arr1 = [i for i in range(100000000)]
arr2 = [i for i in range(100000000, 0, -1)]
sum = 0

for i in range(10000000):
    sum += arr1[i] + arr2[i]

end = time.process_time()

print("Time elapsed: ", end - start)  # seconds

print("zip 사용 X")

start = time.process_time()

arr1 = [i for i in range(100000000)]
arr2 = [i for i in range(100000000, 0, -1)]
sum = 0

for num1, num2 in zip(arr1, arr2):
    sum += num1 + num2

end = time.process_time()

print("Time elapsed: ", end - start)  # seconds

zip은 객체들을 묶어주는 과정까지 필요하기 때문에 대략 2배정도의 훨씬 오랜 수행시간이 걸린다.
생각보다 차이가 더 컸다.


결론

결론적으로는 enumerate와 zip 모두 기본 for문을 사용하는 것보다는 느리다.
하지만 enumerate는 1.2배 정도 차이가 나는 것을 보아 코딩테스트 문제에서 enumerate를 사용해서 시간제한에 걸릴 일은 적어보인다. 휴 다행..
그런데 zip은 2배 정도 차이가 나기 때문에 시간 제한이 널널한 문제가 아니라면 사용하는 것을 지양해야 할 것 같다.

profile
개발로 나를 계발하다.

0개의 댓글

관련 채용 정보