본문 바로가기

Python

np.clip 과 min,max 성능비교

어떤 변수의 값을 일정 범위 내로 제한하는 함수는 종종 쓰인다. 

많이 사용하는 방법으로는 파이썬 내장함수인 min, max 가 있고, numpy 의 np.clip 을 사용하는 방법이 있다. 

 

먼저... 

NumPy의 np.clip 함수는

배열의 값이 지정한 최소값과 최대값을 벗어나지 않도록 잘라주는 함수

 

즉,

  • 최소값보다 작으면 최소값으로
  • 최대값보다 크면 최대값으로
  • 그 사이 값은 그대로 유지

해주는 함수이다. 

 

사용하는 것도 간단한데, 

numpy.clip(a, a_min, a_max)
  • a: 대상 배열
  • a_min: 최소값
  • a_max: 최대값

→ a의 값들을 a_min~a_max 범위로 제한한 결과 배열 반환

 

자, 실제 사용예제를 보자. 

import numpy as np

# 원본 배열
arr = np.array([-5, 0, 3, 7, 10, 15])

# -1 ~ 10 사이로 값 제한
clipped_arr = np.clip(arr, -1, 10)

print("원본 배열:", arr)
print("clip 결과:", clipped_arr)

실행해보면 아래처럼 나온다. 

요약해보면

 

  • 배열의 값 범위를 제한하는 함수
  • np.clip(a, min, max)
  • min 보다 작으면 min, max 보다 크면 max
  • 데이터 후처리, 속도/가속도 제한, 그래프 시각화 시 안전범위 제한 등에 활용

 


자.. 그런데 np.clip 말고도 python 기본함수로 제공하는 min(), max()를 이용해서도 동일한 기능을 구현할 수 있다. 

이것 역시 그리 어렵지도 않다. 

 

그러면 동일한 기능을 하는 두 방법 (np.clip vs. min,max) 중 어느 것이 빠를까?

한번 성능을 비교해보자. 

 

결론부터 간략히 말하면:

  • 단일 값 min/max → min, max 내장함수가 빠름
  • 배열 전체를 min/max 제한 → np.clip이 훨씬 빠르고, 특히 큰 배열에서 NumPy 벡터 연산의 성능 이점이 큼

실제로 그런지 한번 예제를 만들어서 눈으로 확인해보자. 

 

대상:

  • 100만 개 난수 배열
  • 각각의 값을
    • np.clip으로 제한
    • min/max 내장함수로 반복문 돌며 제한

시간 측정은 time 모듈로 한다. 

import numpy as np
import time

# 100만 개 난수 배열 생성
arr = np.random.uniform(-10, 20, size=1_000_000)
min_val, max_val = 0.0, 10.0

# np.clip 성능 측정
start_time = time.time()
clipped_np = np.clip(arr, min_val, max_val)
np_time = time.time() - start_time
print(f"np.clip 소요 시간: {np_time:.6f}초")

# 내장 min/max로 반복문 성능 측정
start_time = time.time()
clipped_py = np.array([min(max(x, min_val), max_val) for x in arr])
py_time = time.time() - start_time
print(f"내장 min/max + for문 소요 시간: {py_time:.6f}초")

# 결과 비교
print(f"속도 차이 배율: {py_time / np_time:.1f}배")

 

실행해보면...

배열에 대해서는 np.clip이 훨씬 빠르다

 

흠... 역시 배열에 대한 연산은 np.clip 이 훨씬 빠르다고 나온다. 

그럼 혹시, 혹시라도... 변수 하나에 대한 속도차이는 어떻게 될 까? 

 

변수 하나에 대해서 속도측정하는 예제를 만들어보자. 

 

일단 단일 값일 때는... 

  • 단일 값일 때
    np.clip은 사실 NumPy 함수 호출 오버헤드가 있어서 느릴 가능성이 높음
  • min(max(x, min_val), max_val) 이 훨씬 가벼운 파이썬 연산

직접 측정해보자. 

import numpy as np
import time

x = 7.5
min_val, max_val = 0.0, 10.0

# np.clip 성능 측정 (1000만번 반복)
start_time = time.time()
for _ in range(10_000_000):
    np.clip(x, min_val, max_val)
np_time = time.time() - start_time
print(f"np.clip 소요 시간: {np_time:.6f}초")

# min/max 내장함수 성능 측정 (1000만번 반복)
start_time = time.time()
for _ in range(10_000_000):
    min(max(x, min_val), max_val)
py_time = time.time() - start_time
print(f"내장 min/max 소요 시간: {py_time:.6f}초")

# 속도 차이 배율
print(f"속도 차이 배율: {np_time / py_time:.1f}배")

 

실행해보면 아래와 같은 결과가 나온다. 

단일변수라면 내장 min/max 함수가 더 빠르다!!

 

물론 단일변수에 대해서는 np.clip을 쓰나 내장함수 min/max를 쓰나 절대적인 시간차이는 크지 않다. 

그러나 배열에 대해서는 성능차이가 좀 있으니 기억했다가 필요할 때 쓰면 되겠다. 

 

그럼 이만~