付録C: パフォーマンス最適化ガイド

プロファイリングとボトルネック特定

import cProfile
import pstats
from line_profiler import LineProfiler

def profile_function(func):
    """関数のプロファイリング"""
    def wrapper(*args, **kwargs):
        profiler = cProfile.Profile()
        profiler.enable()
        
        result = func(*args, **kwargs)
        
        profiler.disable()
        stats = pstats.Stats(profiler).sort_stats('cumulative')
        stats.print_stats(10)  # 上位10個の関数を表示
        
        return result
    
    return wrapper

# 使用例
@profile_function
def slow_function():
    # 処理内容
    pass

メモリ効率的なデータ構造

# NumPy配列の型指定によるメモリ削減
import numpy as np

def optimize_memory_usage(data):
    """データ型の最適化によるメモリ削減"""
    if data.dtype == np.float64:
        # float32で十分な精度の場合
        if np.all(np.abs(data) < 1e6):
            data = data.astype(np.float32)
    
    elif data.dtype == np.int64:
        # より小さい整数型で表現可能な場合
        if data.min() >= 0 and data.max() < 255:
            data = data.astype(np.uint8)
        elif data.min() >= -128 and data.max() < 127:
            data = data.astype(np.int8)
    
    return data

並列化の最適化

from numba import jit, prange
import numpy as np

@jit(nopython=True, parallel=True)
def parallel_computation(data):
    """Numbaによる並列化"""
    n = len(data)
    result = np.zeros(n)
    
    for i in prange(n):
        # 並列実行される処理
        result[i] = expensive_operation(data[i])
    
    return result

@jit(nopython=True)
def expensive_operation(x):
    """計算集約的な処理(Numba用)"""
    return x ** 2 + np.sin(x) * np.exp(-x)

← 前へ: トラブルシューティング 目次に戻る 次へ: セキュリティ →