付録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)
← 前へ: トラブルシューティング | 目次に戻る | 次へ: セキュリティ → |