루프 제거

효율적인 Python 코드 작성

Logan Thomas

Scientific Software Technical Trainer, Enthought

Python에서의 루프

  • 루프 패턴:
    • for 루프: 시퀀스를 순차적으로 반복
    • while 루프: 조건이 충족되는 동안 반복
    • "중첩" 루프: 루프 안에 다른 루프 사용
    • 비용이 큽니다!
효율적인 Python 코드 작성

루프 제거의 이점

  • 코드 줄 수 감소
  • 코드 가독성 향상
    • "중첩보다 평탄한 구조가 낫다"
  • 효율성 향상
효율적인 Python 코드 작성

내장 함수로 루프 제거하기

# List of HP, Attack, Defense, Speed
poke_stats = [
    [90,  92, 75, 60],
    [25,  20, 15, 90],
    [65, 130, 60, 75],
    ...
]

alt="포켓몬 Abomasnow, Abra, Absol과 해당 HP, 공격, 방어, 속도 정보가 강조 표시된 화면"

효율적인 Python 코드 작성
# List of HP, Attack, Defense, Speed
poke_stats = [
    [90,  92, 75, 60],
    [25,  20, 15, 90],
    [65, 130, 60, 75],
    ...
]

# For loop approach totals = [] for row in poke_stats: totals.append(sum(row))
# List comprehension totals_comp = [sum(row) for row in poke_stats]
# Built-in map() function totals_map = [*map(sum, poke_stats)]
효율적인 Python 코드 작성
%%timeit
totals = []
for row in poke_stats:
    totals.append(sum(row))
140 µs ± 1.94 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit totals_comp = [sum(row) for row in poke_stats]
114 µs ± 3.55 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit totals_map = [*map(sum, poke_stats)]
95 µs ± 2.94 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
효율적인 Python 코드 작성

내장 모듈로 루프 제거하기

poke_types = ['Bug', 'Fire', 'Ghost', 'Grass', 'Water']
# Nested for loop approach
combos = []
for x in poke_types:
    for y in poke_types:
        if x == y:
            continue
        if ((x,y) not in combos) & ((y,x) not in combos):
            combos.append((x,y))
# Built-in module approach
from itertools import combinations
combos2 = [*combinations(poke_types, 2)]
효율적인 Python 코드 작성

NumPy로 루프 제거하기

# Array of HP, Attack, Defense, Speed
import numpy as np

poke_stats = np.array([
    [90,  92, 75, 60],
    [25,  20, 15, 90],
    [65, 130, 60, 75],
    ...
])
효율적인 Python 코드 작성

NumPy로 루프 제거하기

avgs = []
for row in poke_stats:
    avg = np.mean(row)
    avgs.append(avg)

print(avgs)
[79.25, 37.5, 82.5, ...]
avgs_np = poke_stats.mean(axis=1)

print(avgs_np)
[ 79.25  37.5   82.5  ...]
효율적인 Python 코드 작성

NumPy로 루프 제거하기

%timeit avgs = poke_stats.mean(axis=1)
23.1 µs ± 235 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%%timeit
avgs = []
for row in poke_stats:
    avg = np.mean(row)
    avgs.append(avg)
5.54 ms ± 224 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
효율적인 Python 코드 작성

연습해 봅시다!

효율적인 Python 코드 작성

Preparing Video For Download...