カテゴリ: Flask 更新日: 2026/03/05

Flaskのパフォーマンス改善ガイド!初心者でもわかるキャッシュと高速化の基本

Flaskのパフォーマンスを改善するための基本ポイントまとめ
Flaskのパフォーマンスを改善するための基本ポイントまとめ

先生と生徒の会話形式で理解しよう

生徒

「Flaskで作ったWebアプリの動きが、最近少し重く感じるんです。もっとサクサク動かす方法はありますか?」

先生

「Webアプリの速度、つまりパフォーマンスを向上させるには『キャッシュ』という仕組みを使うのがとても効果的ですよ。」

生徒

「キャッシュって何ですか?難しそうですが、初心者の私でも設定できるんでしょうか?」

先生

「大丈夫です。キャッシュは『一度計算した結果をメモして使い回す』という、とてもシンプルな知恵なんです。具体的な改善ポイントを見ていきましょう!」

1. パフォーマンス改善とキャッシュの重要性

1. パフォーマンス改善とキャッシュの重要性
1. パフォーマンス改善とキャッシュの重要性

Webアプリの世界で「パフォーマンスが良い」とは、画面を開くボタンを押してから、実際に中身が表示されるまでの時間が短いことを指します。この時間が長いと、使っている人はイライラしてページを閉じてしまいます。そこで登場するのが「キャッシュ」です。

キャッシュとは、料理に例えると「作り置き」のようなものです。注文を受けてから毎回野菜を切って煮込むのではなく、一度作った料理を保存しておき、次の注文が来たら温め直して出すだけにする。これと同じことを、Flaskのプログラムで行います。重い計算やデータの取得を一回だけで済ませることで、二回目以降の表示が劇的に速くなります。

2. Flask-Cachingで手軽に高速化

2. Flask-Cachingで手軽に高速化
2. Flask-Cachingで手軽に高速化

Flaskには、キャッシュの仕組みを簡単に導入できる「Flask-Caching(フラスク・キャッシング)」という便利な道具があります。これを使うと、特定のページだけを丸ごと保存したり、計算結果だけを保存したりすることが可能になります。

まずは、どのくらいの期間「作り置き」を保存しておくかを設定します。これを「有効期限(タイムアウト)」と呼びます。例えば、一分間だけ保存するように設定すれば、その間にアクセスした人は全員、一瞬でページを開くことができます。以下のコードは、その基本的な設定方法です。


from flask import Flask
from flask_caching import Cache

app = Flask(__name__)

# キャッシュの設定。簡単な「シンプルモード」を使います
config = {
    "CACHE_TYPE": "SimpleCache",
    "CACHE_DEFAULT_TIMEOUT": 300 # 300秒(5分間)保存する
}

cache = Cache(app, config=config)

@app.route("/fast")
@cache.cached(timeout=60) # このページを60秒間キャッシュする
def fast_page():
    # 本来はここで重い処理が行われると想定
    return "このページはキャッシュされているので爆速です!"

3. データベースへのアクセス回数を減らす工夫

3. データベースへのアクセス回数を減らす工夫
3. データベースへのアクセス回数を減らす工夫

Webアプリが遅くなる最大の原因の一つは、データベースとのやり取りです。データベースは「大きな図書館」のようなもので、本を探しに行く(データを取りに行く)には時間がかかります。一回の画面表示で何度も図書館に往復していると、それだけで動作が重くなってしまいます。

これを改善するには、必要なデータを一度にまとめて取ってくるか、取り出したデータをキャッシュに一時保存します。特に、あまり内容が変わらない「お知らせ一覧」や「商品カテゴリー」などは、毎回データベースを見に行かずに、キャッシュから読み出すように書き換えるだけで、サーバーの負担が大幅に軽くなります。


@app.route("/items")
def show_items():
    # キャッシュから商品リストを探す
    items = cache.get("all_items")
    
    if items is None:
        # キャッシュになければデータベースから取得(重い処理の代わり)
        items = ["リンゴ", "バナナ", "オレンジ"]
        # 次回のためにキャッシュに保存する
        cache.set("all_items", items, timeout=3600)
    
    return f"商品一覧: {', '.join(items)}"

4. 画像やデザインファイルの軽量化

4. 画像やデザインファイルの軽量化
4. 画像やデザインファイルの軽量化

プログラムの書き方以外にも、パフォーマンスに大きく関わるのが「静的ファイル(せいてきファイル)」です。これは画像、文字のデザインを決めるCSS、動きを作るJavaScriptなどのファイルを指します。サイズが大きな高画質の写真をそのまま使うと、読み込みに時間がかかり、アプリ全体の動きが遅く見えてしまいます。

対策としては、画像のサイズを小さく加工したり、ファイルの容量を削る「圧縮(あっしゅく)」という作業を行ったりします。また、ブラウザキャッシュを活用することも重要です。これは、使っている人のパソコンやスマホの中に「一度見た画像」を保存してもらう仕組みで、二回目以降のアクセスを高速にします。HTMLでは以下のように指定します。


<img src="large-photo.jpg" alt="綺麗な風景" loading="lazy" width="600" height="400">

5. 不要な拡張機能を見直す

5. 不要な拡張機能を見直す
5. 不要な拡張機能を見直す

Flaskはシンプルさが売りの道具ですが、便利だからといって「拡張機能(ライブラリ)」をたくさん入れすぎると、アプリが重くなる原因になります。使っていない機能が裏側で動き続けていると、メモリというコンピュータの作業スペースを無駄に占領してしまうからです。

「本当にこの機能は必要かな?」と定期的に見直しを行い、使っていないものは削除しましょう。これを「スリム化」と呼びます。必要最小限の道具だけで動かすことが、安定したスピードを保つ秘訣です。パソコンを触ったことがない方でも、机の上の不要なものを片付けるのと同じだと思えば、その大切さがわかるはずです。

6. 処理を後回しにする非同期処理の活用

6. 処理を後回しにする非同期処理の活用
6. 処理を後回しにする非同期処理の活用

Webアプリの中には、完了するまでにどうしても時間がかかる作業があります。例えば、ユーザーに確認メールを送る、大きな画像を加工する、といった処理です。これらを画面表示の直前に行うと、処理が終わるまでユーザーは真っ白な画面で待たされることになります。

これを避けるには「非同期処理(ひどうきしょり)」という考え方を使います。これは「重い仕事は裏側のスタッフに任せて、先に『受け付け完了』の画面を出す」という手法です。Flaskでは「Celery(セロリ)」などの道具を使いますが、まずは「今すぐやらなくていいことは後回しにする」という意識を持つだけでも、アプリの体感速度は大きく変わります。

7. テンプレートエンジンの最適化

7. テンプレートエンジンの最適化
7. テンプレートエンジンの最適化

Flaskでは「Jinja2(ジンジャツー)」という仕組みを使って、HTMLの中にプログラムの結果を埋め込みます。これを「レンダリング」と呼びます。このレンダリングの回数が多い、あるいは中身が複雑すぎると、画面を作るだけでコンピュータが疲れてしまいます。

例えば、同じ計算をHTMLの中で何度も繰り返すのではなく、Python側であらかじめ計算を済ませてからHTMLに渡すようにしましょう。HTMLはあくまで「見た目を整える場所」に専念させるのが、パフォーマンス向上の基本ルールです。


@app.route("/user/<name>")
def welcome(name):
    # 複雑な加工はPython側で済ませる
    display_name = name.strip().capitalize()
    # 完成したデータだけを渡す
    return render_template("welcome.html", name=display_name)

8. 本番用サーバーでの実行

8. 本番用サーバーでの実行
8. 本番用サーバーでの実行

開発中に使う「python app.py」という起動方法は、あくまで練習用です。これにはデバッグ機能という「間違い探し」のための余計な機能がたくさん付いているため、本番環境でそのまま使うと非常に遅くなります。クラウドやレンタルサーバーで公開する際は、必ず本番用の強力なエンジン(WSGIサーバーと呼びます)を使いましょう。

代表的なものに「Gunicorn(ユニコーン)」や「uWSGI」があります。これらは一度に複数の処理を並行して行うことができるため、たくさんの人が同時にアクセスしてもスムーズに対応できます。初心者のうちは難しく感じるかもしれませんが、「本番では専用のエンジンに載せ替える」ということだけ覚えておけば十分です。

9. ログ機能で遅い場所を見つける

9. ログ機能で遅い場所を見つける
9. ログ機能で遅い場所を見つける

どこが遅いのかわからないまま対策をするのは、原因を知らずに薬を飲むようなものです。そこで「ログ(記録)」を活用します。どの処理に何秒かかったかを記録に残すことで、「このデータベースの検索が犯人だ!」と特定できるようになります。

計測を始めると、意外な場所がボトルネック(全体の流れを止めている場所)になっていることに気づきます。そこを重点的にキャッシュしたり、書き方を変えたりすることで、最小限の努力で最大限の効果を得ることができます。常に数字を見て判断するのが、プロの最適化への近道です。以下の簡単な計測例を見てみましょう。


import time

@app.before_request
def start_timer():
    # 処理が始まる時間を記録
    g.start = time.time()

@app.after_request
def log_response(response):
    # 終わった時間との差を計算
    now = time.time()
    duration = round(now - g.start, 2)
    # 0.5秒以上かかったら警告として記録する
    if duration > 0.5:
        app.logger.warning(f"遅いページを発見: {duration}秒かかりました")
    return response
カテゴリの一覧へ
新着記事
New1
Flask
Flask-RESTfulの基本!API開発をシンプルにする拡張機能の導入方法
New2
Flask
FlaskでPOSTリクエストを受け取る方法!初心者でもわかるJSONデータの受け取り方
New3
Flask
FlaskのAPI開発でテストを始めよう!初心者でもわかるpytestを使った基本テスト例
New4
Flask
Flaskのエラーページをカスタマイズする方法!404・500ページの作り方まとめ
人気記事
No.1
Java&Spring記事人気No1
Python
Pythonで仮想環境(venv)を作る方法!初心者向けに環境構築をステップ解説
No.2
Java&Spring記事人気No2
Python
Pythonの文字列を1文字ずつ処理する方法!for文やlist化の活用例
No.3
Java&Spring記事人気No3
Flask
Flaskアプリの環境変数をクラウドで安全に設定する方法!初心者のための完全ガイド
No.4
Java&Spring記事人気No4
Python
Pythonのコメント活用術!初心者向けにTODO・FIXME・ドキュメンテーションコメントの書き方を完全解説
No.5
Java&Spring記事人気No5
Python
Pythonのbytes型とbytearray型とは?初心者向けにバイナリデータの扱い方を解説!
No.6
Java&Spring記事人気No6
Python
Pythonで定数を定義する方法!変更されない変数の書き方と命名ルールを初心者向けに解説
No.7
Java&Spring記事人気No7
Python
Pythonで空白や不要な文字を削除する方法!strip(), rstrip(), lstrip() の使い方を初心者向けに解説
No.8
Java&Spring記事人気No8
Python
Pythonとは何か?初心者向けにできること・特徴・インストール手順までやさしく解説