<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>メモ化  |  Python-memo｜自動化・AI・Web開発の実験室</title>
	<atom:link href="https://python.cbagames.jp/tag/%e3%83%a1%e3%83%a2%e5%8c%96/feed/" rel="self" type="application/rss+xml" />
	<link>https://python.cbagames.jp</link>
	<description>Pythonで、できるをふやそう。</description>
	<lastBuildDate>Mon, 02 Feb 2026 05:56:03 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>

<image>
	<url>https://python.cbagames.jp/wp-content/uploads/2025/06/cropped-497d491d54402de785c9e043bfa0620a-32x32.png</url>
	<title>メモ化  |  Python-memo｜自動化・AI・Web開発の実験室</title>
	<link>https://python.cbagames.jp</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【Python高速化】@cacheデコレーターでメモ化を簡単実装！初心者でも再帰処理が爆速に！</title>
		<link>https://python.cbagames.jp/2025/06/23/python-cache-decorator-memoization/</link>
					<comments>https://python.cbagames.jp/2025/06/23/python-cache-decorator-memoization/#respond</comments>
		
		<dc:creator><![CDATA[asukapy]]></dc:creator>
		<pubDate>Mon, 23 Jun 2025 02:20:04 +0000</pubDate>
				<category><![CDATA[Python入門]]></category>
		<category><![CDATA[functools]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[アルゴリズム]]></category>
		<category><![CDATA[デコレーター]]></category>
		<category><![CDATA[メモ化]]></category>
		<category><![CDATA[再帰関数]]></category>
		<category><![CDATA[高速化]]></category>
		<guid isPermaLink="false">https://python.cbagames.jp/?p=494</guid>

					<description><![CDATA[目次 1.はじめに｜2.メモ化の基本｜なぜ高速化できるのか？計算結果を“覚える”だけで速くなる！例えるなら「一度調べたことをノートにメモする」感覚「キャッシュ」に保存しておく＝一種のメモリ機能3.Pythonでの実装方法 [&#8230;]]]></description>
										<content:encoded><![CDATA[

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2"><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">1.はじめに｜</a></li><li><a href="#toc2" tabindex="0">2.メモ化の基本｜なぜ高速化できるのか？</a><ol><li><a href="#toc3" tabindex="0">計算結果を“覚える”だけで速くなる！</a></li><li><a href="#toc4" tabindex="0">例えるなら「一度調べたことをノートにメモする」感覚</a></li><li><a href="#toc5" tabindex="0">「キャッシュ」に保存しておく＝一種のメモリ機能</a></li></ol></li><li><a href="#toc6" tabindex="0">3.Pythonでの実装方法｜@cache / @lru_cacheの使い分け</a><ol><li><a href="#toc7" tabindex="0">Python 3.9以降なら @cache が一番シンプル</a></li><li><a href="#toc8" tabindex="0">Python 3.8以前は @lru_cache を使おう！</a></li><li><a href="#toc9" tabindex="0">cacheとlru_cacheの違いまとめ</a></li></ol></li><li><a href="#toc10" tabindex="0">4.メモ化の注意点｜使えばいいってものじゃない！</a><ol><li><a href="#toc11" tabindex="0">① プロセスが終わればキャッシュは消える</a></li><li><a href="#toc12" tabindex="0">② 関数に“副作用”があるとメモ化は危険！</a><ol><li><a href="#toc13" tabindex="0">❌ こんな関数はメモ化に不向き：</a></li></ol></li><li><a href="#toc14" tabindex="0">まとめ：こんな関数にメモ化は向いてます！</a></li></ol></li><li><a href="#toc15" tabindex="0">5.実例：フィボナッチ数列を使ったメモ化の効果</a><ol><li><a href="#toc16" tabindex="0">フィボナッチ数列とは？</a></li><li><a href="#toc17" tabindex="0">メモ化なしで書くとどうなる？</a></li><li><a href="#toc18" tabindex="0">メモ化ありで書くと一気に高速化！</a></li><li><a href="#toc19" tabindex="0">実際に速度を比較してみた</a></li><li><a href="#toc20" tabindex="0">再帰＋メモ化＝動的計画法にも応用可能！</a></li></ol></li><li><a href="#toc21" tabindex="0">まとめ｜メモ化は再帰や動的計画法の味方</a><ol><li><a href="#toc22" tabindex="0">✅ メモ化とは？</a></li><li><a href="#toc23" tabindex="0">✅ Pythonでの使い方</a></li><li><a href="#toc24" tabindex="0">✅ 注意点</a></li><li><a href="#toc25" tabindex="0">✅ どんなときに使うと効果的？</a></li><li><a href="#toc26" tabindex="0">あわせて読みたい</a></li></ol></li><li><a href="#toc27" tabindex="0">よくある質問（Q&amp;A）</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">1.はじめに｜</span></h2>



<p>Pythonでプログラムを書いていると、<br>「処理が遅い…」「同じ関数が何度も呼ばれていそう…」と感じたことはありませんか？</p>



<p>特に<strong>再帰処理</strong>や計算量の多いロジックでは、同じ引数で同じ関数が何度も実行され、無駄な計算が積み重なりがちです。<br>その結果、コード自体はシンプルなのに、実行速度だけが極端に遅くなるケースも少なくありません。</p>



<p>そんなときに役立つのが、Pythonの**メモ化（memoization）**という高速化テクニックです。<br>メモ化とは、<strong>一度計算した関数の結果を保存し、次回以降は計算せずに使い回す仕組み</strong>のこと。<br>これだけで、再帰処理の実行時間が劇的に短縮される場合があります。</p>



<p>そしてPythonでは、このメモ化を<br><strong><code>@cache</code> や <code>@lru_cache</code> といったデコレーターを1行追加するだけ</strong>で簡単に実装できます。<br>難しい最適化や複雑なコード修正は必要ありません。</p>



<p>この記事では、Python初心者の方でも理解できるように、</p>



<ul class="wp-block-list">
<li>メモ化とは何か</li>



<li><code>@cache</code> デコレーターの使い方</li>



<li>どんな処理で効果が出るのか</li>



<li>実際にどれくらい高速化されるのか</li>
</ul>



<p>を順番に解説していきます。</p>



<p>最後には、定番の<strong>フィボナッチ数列</strong>を例に、<br>「なぜ再帰が遅くなるのか」「@cacheでなぜ爆速になるのか」を体感できる構成になっています。</p>



<p>それでは、Pythonコードを<strong>最小の修正で高速化する方法</strong>を見ていきましょう。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>


<p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2494518121553371"
     crossorigin="anonymous"></script><br />
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-2494518121553371"
     data-ad-slot="2936039508"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></p>



<h2 class="wp-block-heading"><span id="toc2">2.メモ化の基本｜なぜ高速化できるのか？</span></h2>



<p>では、「メモ化（memoization）」って一体なにがどう高速なの？と思いますよね。ここでは、<strong>どうして処理が速くなるのか、その仕組み</strong>をやさしく解説します。</p>



<h3 class="wp-block-heading"><span id="toc3">計算結果を“覚える”だけで速くなる！</span></h3>



<p>メモ化の基本的な考え方はとてもシンプルです。<br>**「同じ計算を何度も繰り返さないように、前の結果を覚えておこう」**というものです。</p>



<p>例えばこんな関数があったとします：</p>



<pre class="wp-block-preformatted"><code>def calc(x):<br>    print("計算中…")<br>    return (x + 10) // 3<br></code></pre>



<p>この関数を、同じ引数（たとえば <code>110</code>）で2回呼び出すと、2回とも「計算中…」が表示されて、同じ計算が繰り返されます。</p>



<p>でも、1回目の結果が保存されていて、2回目に使い回せたらどうでしょう？<br><strong>2回目は計算をスキップして、保存しておいた値をそのまま返すことができます。</strong></p>



<p>つまり、<strong>「時間のかかる計算を1回に減らせる」＝高速化につながる</strong>というわけです。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc4">例えるなら「一度調べたことをノートにメモする」感覚</span></h3>



<p>学校での勉強に例えると、一度辞書で調べた単語の意味をノートに書いておくイメージです。<br>2回目以降はそのノートを見ればすぐに答えが分かるので、わざわざまた辞書を開かなくても済みますよね。</p>



<p>プログラムでもこれと同じで、<strong>関数の結果をキャッシュ（保存）しておけば、次は一瞬で結果を返せる</strong>のです。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc5">「キャッシュ」に保存しておく＝一種のメモリ機能</span></h3>



<p>この「結果を覚えておく場所」を**キャッシュ（cache）**と呼びます。Pythonでは、<code>@cache</code>や<code>@lru_cache</code>といったデコレーターを使えば、関数にこのキャッシュ機能を簡単に付け加えることができます。</p>



<p>こうして一度呼び出した関数の「入力」と「出力」のペアをキャッシュに記録しておき、次に同じ「入力」が来たら、それに対応する「出力」を即座に返してくれるんです。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://python.cbagames.jp/wp-content/uploads/2025/06/9d9697ea94c9608a27d0bde31599ba86-150x150.jpg" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>次は、実際にこのキャッシュ機能をPythonでどうやって使うのかを見てみましょう！<br>→ **「Pythonでの実装方法｜@cache / @lru_cacheの使い分け」**へ進みます。</p>
</div></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>


<p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2494518121553371"
     crossorigin="anonymous"></script><br />
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-2494518121553371"
     data-ad-slot="2936039508"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></p>



<h2 class="wp-block-heading"><span id="toc6">3.Pythonでの実装方法｜@cache / @lru_cacheの使い分け</span></h2>



<p>ここからは、実際にPythonでメモ化を使う方法を紹介していきます。<br>じつはPythonには、メモ化を<strong>すごく簡単に実装できる標準の仕組み</strong>が用意されています。それが、<code>functools</code>モジュールにある**<code>@cache</code><strong>と</strong><code>@lru_cache</code>**というデコレーターです。</p>



<p>どちらも、関数の前に書くだけで使えるので、とても手軽ですよ！</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc7">Python 3.9以降なら @cache が一番シンプル</span></h3>



<p>Python 3.9以上を使っている方には、**<code>@functools.cache</code>**がいちばんおすすめです。</p>



<pre class="wp-block-preformatted"><code>from functools import cache<br><br>@cache<br>def calc(x):<br>    print("計算中…")<br>    return (x + 10) // 3<br><br>print(calc(110))  # 1回目：計算される<br>print(calc(110))  # 2回目：キャッシュが使われる<br></code></pre>



<p>このように、関数の上に <code>@cache</code> と書くだけで、<strong>同じ引数が来たときには計算せず、結果を再利用</strong>してくれます。</p>



<p>特徴としては以下の通り：</p>



<ul class="wp-block-list">
<li><strong>キャッシュの上限がない</strong>（無制限）</li>



<li><strong>高速でシンプル</strong></li>



<li><strong>関数に変更がない場合に最適</strong></li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc8">Python 3.8以前は @lru_cache を使おう！</span></h3>



<p>Python 3.8やそれ以前のバージョンを使っている場合は、代わりに <code>@lru_cache</code> を使いましょう。</p>



<pre class="wp-block-preformatted"><code>from functools import lru_cache<br><br>@lru_cache(maxsize=128)<br>def calc(x):<br>    print("計算中…")<br>    return (x + 10) // 3<br></code></pre>



<p><code>@lru_cache(maxsize=128)</code> では、<strong>最大128個までの結果をキャッシュ</strong>します。<br><code>maxsize</code>の数を大きくすれば、より多くのパターンを覚えられます。</p>



<p>特徴はこちら：</p>



<ul class="wp-block-list">
<li><strong>キャッシュの上限を指定できる</strong>（デフォルトは128）</li>



<li><strong>古いものから自動で削除（LRU：Least Recently Used）</strong></li>



<li><strong>Python 3.2以降で使用可能</strong></li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc9">cacheとlru_cacheの違いまとめ</span></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>比較項目</th><th><code>@cache</code>（3.9以降）</th><th><code>@lru_cache</code>（3.2以降）</th></tr></thead><tbody><tr><td>キャッシュ容量</td><td>無制限</td><td>デフォルト128（変更可）</td></tr><tr><td>削除方式</td><td>なし</td><td>古い順に自動削除</td></tr><tr><td>対応バージョン</td><td>Python 3.9以上</td><td>Python 3.2以上</td></tr><tr><td>書き方のシンプルさ</td><td>とてもシンプル</td><td>少しオプションあり</td></tr></tbody></table></figure>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://python.cbagames.jp/wp-content/uploads/2025/06/9d9697ea94c9608a27d0bde31599ba86-150x150.jpg" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>どちらを使うかはPythonのバージョンと使い方次第ですが、**最新のPythonが使えるなら迷わず<code>@cache</code>**がベストです！</p>



<p>次は、実際にメモ化を使うときに<strong>注意しておきたいポイント</strong>を紹介します。</p>
</div></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>


<p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2494518121553371"
     crossorigin="anonymous"></script><br />
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-2494518121553371"
     data-ad-slot="2936039508"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></p>



<h2 class="wp-block-heading"><span id="toc10">4.メモ化の注意点｜使えばいいってものじゃない！</span></h2>



<p>メモ化はとても便利なテクニックですが、<strong>どんなときでも使っていいわけではありません。</strong><br>むしろ、ちゃんと理解して使わないと、「なんで速くならないの？」「逆にメモリが足りない…」ということにもなりかねません。</p>



<p>ここでは、メモ化を使うときに覚えておきたい2つの重要な注意点を紹介します。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc11">① プロセスが終わればキャッシュは消える</span></h3>



<p>メモ化で保存されるデータ（キャッシュ）は、<strong>プログラムを実行しているあいだだけ有効</strong>です。</p>



<p>つまり、Pythonスクリプトを一度閉じてしまえば、せっかくキャッシュされた情報も全部リセットされます。電源を切ったらノートが白紙になるようなイメージですね。</p>



<p>✅ <strong>ポイント：</strong> メモ化は「長期保存」ではなく、「一時的な高速化」に向いています！</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc12">② 関数に“副作用”があるとメモ化は危険！</span></h3>



<p>メモ化がうまく機能するには、その関数が**「参照透過」であること**が必要です。</p>



<p>ちょっと難しそうに聞こえますが、簡単に言うと：</p>



<p><strong>「同じ引数なら、いつでも同じ結果が返ってくる関数」じゃないとダメ！</strong></p>



<p>ということです。</p>



<p>たとえば、関数の中で毎回ランダムな値を返したり、リストの内容を変更するような処理が入っていると、<strong>過去の結果を再利用するのが正しくなくなってしまいます。</strong></p>



<h4 class="wp-block-heading"><span id="toc13">❌ こんな関数はメモ化に不向き：</span></h4>



<pre class="wp-block-preformatted"><code>import random<br><br>def get_random_value(x):<br>    return x + random.randint(1, 10)<br></code></pre>



<p>この関数は毎回結果が変わるので、キャッシュしても意味がありません。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc14">まとめ：こんな関数にメモ化は向いてます！</span></h3>



<p>✅ いつも同じ引数には、同じ結果が返ってくる関数<br>✅ 時間のかかる計算をする関数<br>✅ 再帰的に何度も呼ばれる関数（フィボナッチなど）</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>


<p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2494518121553371"
     crossorigin="anonymous"></script><br />
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-2494518121553371"
     data-ad-slot="2936039508"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></p>



<h2 class="wp-block-heading"><span id="toc15">5.実例：フィボナッチ数列を使ったメモ化の効果</span></h2>



<p>ここまで読んで「ふーん、メモ化って便利そうだな」と思った方、実際にどれくらい速くなるのか気になりますよね？<br>そこで、メモ化がとくに威力を発揮する例として有名な**「フィボナッチ数列」**を使って、効果を体験してみましょう！</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc16">フィボナッチ数列とは？</span></h3>



<p>フィボナッチ数列は、次のようなルールで作られる数字の並びです：</p>



<pre class="wp-block-preformatted"><code>0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...<br></code></pre>



<p>ルールはとてもシンプルで、「<strong>2つ前と1つ前の数字を足す</strong>」ことで次の数字を求めます。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc17">メモ化なしで書くとどうなる？</span></h3>



<p>まずは、メモ化を使わずにフィボナッチ数を求める関数を見てみましょう。</p>



<pre class="wp-block-preformatted"><code>def fib(n):<br>    if n &lt;= 1:<br>        return n<br>    return fib(n - 1) + fib(n - 2)<br></code></pre>



<p>この関数、ぱっと見ではわかりやすいですが、<strong>同じ計算を何度も繰り返してしまう</strong>という弱点があります。<br>たとえば <code>fib(30)</code> を計算しようとすると、内部で <code>fib(29)</code> と <code>fib(28)</code> を呼び出し、それぞれがさらにその前の値を…と、<strong>計算が爆発的に増えてしまう</strong>んです。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc18">メモ化ありで書くと一気に高速化！</span></h3>



<p>そこで、さっそく <code>@cache</code> を使ってメモ化してみましょう。</p>



<pre class="wp-block-preformatted"><code>from functools import cache<br><br>@cache<br>def fib(n):<br>    if n &lt;= 1:<br>        return n<br>    return fib(n - 1) + fib(n - 2)<br></code></pre>



<p>たったこれだけで、<strong>一度計算した結果がすべてキャッシュに保存される</strong>ので、同じ計算を何度もしなくて済みます。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc19">実際に速度を比較してみた</span></h3>



<p>試しに、次のようなコードで処理時間を測ってみましょう。</p>



<pre class="wp-block-preformatted"><code>import time<br><br>start = time.time()<br>print(fib(35))<br>end = time.time()<br>print("処理時間：", end - start)<br></code></pre>



<ul class="wp-block-list">
<li>メモ化なし：およそ <strong>0.1〜1秒以上</strong></li>



<li>メモ化あり：およそ <strong>0.00005秒前後</strong></li>
</ul>



<p>なんと、<strong>数千倍以上のスピードアップ</strong>が見込める結果になりました！</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc20">再帰＋メモ化＝動的計画法にも応用可能！</span></h3>



<p>このように、<strong>再帰処理にメモ化を組み合わせると、動的計画法（DP）のような効率的なアルゴリズムが実現できます。</strong><br>競技プログラミングやデータ解析の現場でも、計算コストの高い処理を減らすために活用されています。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>


<p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2494518121553371"
     crossorigin="anonymous"></script><br />
<ins class="adsbygoogle"
     style="display:block; text-align:center;"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-2494518121553371"
     data-ad-slot="2936039508"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script></p>



<h2 class="wp-block-heading"><span id="toc21">まとめ｜メモ化は再帰や動的計画法の味方</span></h2>



<p>ここまで、Pythonで使える便利なテクニック「メモ化」について解説してきました。<br>最後に、今回の内容をざっくり振り返ってみましょう。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc22">✅ メモ化とは？</span></h3>



<p>関数の<strong>引数と結果をセットで記憶</strong>しておき、同じ引数が来たときに再利用する仕組み。<br>計算をサボれるので、その分<strong>処理が高速化</strong>されます！</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc23">✅ Pythonでの使い方</span></h3>



<ul class="wp-block-list">
<li>Python 3.9以上なら <code>@cache</code></li>



<li>それ以前は <code>@lru_cache(maxsize=128)</code><br>どちらも <code>functools</code> モジュールからインポートして、関数の上に1行書くだけ！</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc24">✅ 注意点</span></h3>



<ul class="wp-block-list">
<li>プログラム終了後はキャッシュが消える</li>



<li>関数は**参照透過（副作用なし）**であることが前提</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc25">✅ どんなときに使うと効果的？</span></h3>



<ul class="wp-block-list">
<li>再帰処理（例：フィボナッチ数列）</li>



<li>同じ関数が同じ引数で何度も呼ばれるケース</li>



<li>アルゴリズムの最適化や動的計画法の実装時</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>メモ化は、普段のプログラミングではそこまで頻繁に使うものではありません。<br>でも、<strong>使いどころを見極めて導入すると、コードの効率が劇的に上がることも</strong>ある、とっておきのテクニックです。</p>



<p>ぜひこの記事をきっかけに、「あれ？この関数、同じ引数で何度も呼ばれてない？」と思ったときには、<strong>@cacheデコレーターを試してみてください！</strong></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><span id="toc26">あわせて読みたい</span></h3>



<p>以下の記事もあわせて読むと、Pythonの理解がさらに深まります！</p>



<ul class="wp-block-list">
<li><a>Pythonのデコレーターとは？基礎から使い方まで解説！</a><br>　→ <code>@cache</code> や <code>@lru_cache</code> のようなデコレーターの仕組みを基礎から理解したい方におすすめ！</li>



<li><a>Pythonの再帰関数をやさしく解説｜初心者でもわかる再帰処理の考え方</a><br>　→ フィボナッチ数列のような再帰的な関数の考え方と書き方を学べます。</li>



<li><a>Pythonのアルゴリズム基礎入門｜考え方とサンプルコードで身につけよう</a><br>　→ 動的計画法を含むアルゴリズムの初歩を知りたい方向け。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc27">よくある質問（Q&amp;A）</span></h2>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content"><code>@cache</code>と<code>@lru_cache</code>の違いって何ですか？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p><code>@cache</code>はキャッシュの上限がなく、Python 3.9以降で使えるシンプルなデコレーターです。<code>@lru_cache</code>はキャッシュの数に上限があり、古いものから削除される仕組みがついています。Python 3.2以降で使用できます。</p>
</div></dd></dl></div>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">キャッシュされたデータをクリアするにはどうすればいい？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p>キャッシュをクリアしたい場合は、関数に <code>.cache_clear()</code> を呼び出すことでリセットできます。</p>



<pre class="wp-block-preformatted"><code>fib.cache_clear()</code></pre>
</div></dd></dl></div>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">すべての関数でメモ化を使っていいの？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p>いいえ。副作用がある関数（リストを変更したり、乱数を返す関数など）では、キャッシュされた結果が正しくなくなることがあります。<strong>参照透過性がある関数</strong>に使うのが基本です。</p>
</div></dd></dl></div>
]]></content:encoded>
					
					<wfw:commentRss>https://python.cbagames.jp/2025/06/23/python-cache-decorator-memoization/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
