[파이썬] I/O 바운드 작업과 CPU 바운드 작업 예제
I/O 바운드 작업과 CPU 바운드 작업은 다른 유형의 작업으로, 각각 다른 리소스 요구 사항과 최적화 전략을 필요로 합니다. 아래에는 각 유형의 작업에 대한 예제를 제공합니다.
I/O 바운드 작업 예제:
I/O 바운드 작업은 주로 파일 입출력, 네트워크 통신, 데이터베이스 쿼리와 같이 입출력 속도가 느린 작업을 말합니다. 아래는 파일을 읽는 I/O 바운드 작업의 예제입니다.
import time
def read_file(filename):
with open(filename, 'r') as file:
data = file.read()
print(f'Read {len(data)} bytes from {filename}')
if __name__ == '__main__':
filenames = ['file1.txt', 'file2.txt', 'file3.txt']
start_time = time.time()
for filename in filenames:
read_file(filename)
end_time = time.time()
elapsed_time = end_time - start_time
print(f'Total elapsed time: {elapsed_time:.2f} seconds')
이 예제는 세 개의 파일을 순차적으로 읽습니다. I/O 작업을 수행할 때 다른 작업을 기다리는 동안 CPU는 유휴 상태에 있으므로, 멀티스레딩 또는 비동기 작업을 통해 I/O 성능을 향상시킬 수 있습니다.
CPU 바운드 작업 예제:
CPU 바운드 작업은 주로 계산량이 많은 작업을 말하며, 대표적으로 숫자 계산, 암호화, 데이터 분석 등이 있습니다. 아래는 간단한 CPU 바운드 작업인 소수(prime) 계산의 예제입니다.
import time
import math
def is_prime(n):
if n <= 1:
return False
if n <= 3:
return True
if n % 2 == 0 or n % 3 == 0:
return False
i = 5
while i * i <= n:
if n % i == 0 or n % (i + 2) == 0:
return False
i += 6
return True
def calculate_primes(start, end):
prime_count = 0
for num in range(start, end):
if is_prime(num):
prime_count += 1
return prime_count
if __name__ == '__main__':
start = 1
end = 10000
start_time = time.time()
prime_count = calculate_primes(start, end)
print(f'Total prime numbers between {start} and {end}: {prime_count}')
end_time = time.time()
elapsed_time = end_time - start_time
print(f'Total elapsed time: {elapsed_time:.2f} seconds')
이 예제에서는 주어진 범위에서 소수를 찾습니다. CPU 바운드 작업은 계산량이 많으므로 멀티프로세싱을 사용하여 다중 CPU 코어에서 병렬로 실행하면 성능을 향상시킬 수 있습니다.
애플리케이션의 특성에 따라 I/O 바운드 또는 CPU 바운드 작업을 다루기 위한 최적의 방법을 선택하고, 멀티스레딩, 멀티프로세싱, 비동기 프로그래밍 등의 기술을 활용하여 성능을 향상시키세요.