RSS惑星Python フォロー Bob Belderbos: プロフィール ファースト: 10倍高速なDjangoテストスイート 著者のRust Platform Djangoテストスイートは当初30秒かかっており、データベースのパフォーマンスに関する憶測を招きました。しかし、cProfileによるプロファイリングで、実際のボトルネックはデータベース関連ではなく、実行時間を3秒に短縮することが明らかになりました。このテキストは、多くのフィクスチャやデータベースの遅延といった解決策を推測するのではなく、パフォーマンスを測定することの重要性を強調しています。特定のボトルネックを特定するためにcProfileのようなプロファイリングツールを使用することを推奨しています。著者はcProfileを使用してpstatsファイルを生成し、その後profiling-explorerでデータを可視化しました。プロファイラーは、Djangoのデフォルトのパスワードハッシャーである_hashlib.pbkdf2_hmac関数がテスト中に過剰な時間を消費していることを強調しました。このハッシャーはブルートフォース攻撃に抵抗するために意図的に遅くされていますが、ユーザーを作成するすべてのテストを不必要に遅くしていました。テスト専用に高速なMD5ハッシャーに切り替えることで、わずか5行の修正が実装されました。この変更は非常に効果的であり、テストスイートの実行時間を大幅に短縮しました。この最初の最適化の後、次に時間のかかる関数はcursor.executeでしたが、これは当初、潜在的なN+1クエリの問題のように見えました。しかし、さらなる測定により、N+1クエリは発生していないことが確認されました。呼び出し回数の多さは、正当なテストセットアップ操作に起因すると考えられました。この経験は、無駄な労力と誤った仮定を避けるために、最適化の前に常にプロファイリングを行うという中心的なメッセージを強化しています。 Bob Belderbos: Profile First: A 10x Faster Django Test Suite belderbos.dev
_hashlib.pbkdf2_hmac関数がテスト中に過剰な時間を消費していることを強調しました。このハッシャーはブルートフォース攻撃に抵抗するために意図的に遅くされていますが、ユーザーを作成するすべてのテストを不必要に遅くしていました。テスト専用に高速なMD5ハッシャーに切り替えることで、わずか5行の修正が実装されました。この変更は非常に効果的であり、テストスイートの実行時間を大幅に短縮しました。この最初の最適化の後、次に時間のかかる関数はcursor.executeでしたが、これは当初、潜在的なN+1クエリの問題のように見えました。しかし、さらなる測定により、N+1クエリは発生していないことが確認されました。呼び出し回数の多さは、正当なテストセットアップ操作に起因すると考えられました。この経験は、無駄な労力と誤った仮定を避けるために、最適化の前に常にプロファイリングを行うという中心的なメッセージを強化しています。