[파이썬] 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 바운드 작업을 다루기 위한 최적의 방법을 선택하고, 멀티스레딩, 멀티프로세싱, 비동기 프로그래밍 등의 기술을 활용하여 성능을 향상시키세요.