<?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/%e9%ab%98%e9%80%9f%e5%8c%96/feed/" rel="self" type="application/rss+xml" />
	<link>https://python.cbagames.jp</link>
	<description>Pythonで、できるをふやそう。</description>
	<lastBuildDate>Wed, 04 Feb 2026 05:14:57 +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>
		<item>
		<title>Pythonの並列処理を完全理解！concurrent.futuresで簡単マルチスレッド＆マルチプロセス</title>
		<link>https://python.cbagames.jp/2025/06/21/python-concurrent-futures-multithread-multiprocess/</link>
					<comments>https://python.cbagames.jp/2025/06/21/python-concurrent-futures-multithread-multiprocess/#respond</comments>
		
		<dc:creator><![CDATA[asukapy]]></dc:creator>
		<pubDate>Sat, 21 Jun 2025 03:21:43 +0000</pubDate>
				<category><![CDATA[自動化スクリプト]]></category>
		<category><![CDATA[concurrent.futures]]></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=471</guid>

					<description><![CDATA[目次 1. はじめに｜Pythonの処理を高速化したい人へ2. 逐次処理とは？｜まずは基本からおさらい■ 逐次処理ってなに？■ どんなイメージ？■ どんなときに困る？3. 並列処理と並行処理の違いをわかりやすく解説■ 並 [&#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-4"><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">1. はじめに｜Pythonの処理を高速化したい人へ</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. 並列処理と並行処理の違いをわかりやすく解説</a><ol><li><a href="#toc7" tabindex="0">■ 並列処理（へいれつしょり）とは？</a></li><li><a href="#toc8" tabindex="0">■ 並行処理（へいこうしょり）とは？</a></li><li><a href="#toc9" tabindex="0">■ 並列 vs 並行：まとめると？</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><li><a href="#toc14" tabindex="0">⚠ デメリット</a></li><li><a href="#toc15" tabindex="0">💡 向いている処理（I/Oバウンド）</a></li></ol></li><li><a href="#toc16" tabindex="0">■ マルチプロセスの特徴と使いどころ</a><ol><li><a href="#toc17" tabindex="0">✅ メリット</a></li><li><a href="#toc18" tabindex="0">⚠ デメリット</a></li><li><a href="#toc19" tabindex="0">💡 向いている処理（CPUバウンド）</a></li></ol></li><li><a href="#toc20" tabindex="0">■ どっちを使えばいいの？</a></li></ol></li><li><a href="#toc21" tabindex="0">5. concurrent.futuresとは？｜初心者にやさしい並列処理モジュール</a><ol><li><a href="#toc22" tabindex="0">■ concurrent.futuresってなに？</a></li><li><a href="#toc23" tabindex="0">■ 2つのExecutorクラスがポイント！</a></li><li><a href="#toc24" tabindex="0">■ どんな書き方をするの？</a></li><li><a href="#toc25" tabindex="0">■ なにがそんなに便利なの？</a></li></ol></li><li><a href="#toc26" tabindex="0">6. ThreadPoolExecutorの使い方</a><ol><li><a href="#toc27" tabindex="0">■ 処理の流れをざっくり説明すると…</a></li><li><a href="#toc28" tabindex="0">■ まずは基本のコードから</a></li><li><a href="#toc29" tabindex="0">■ 実行結果のイメージ</a></li><li><a href="#toc30" tabindex="0">■ map()を使うともっとスッキリ！</a></li><li><a href="#toc31" tabindex="0">■ こんなときに便利！</a></li></ol></li><li><a href="#toc32" tabindex="0">7. ProcessPoolExecutorの使い方</a><ol><li><a href="#toc33" tabindex="0">■ 基本の使い方（コード例）</a></li><li><a href="#toc34" tabindex="0">■ 実行結果のイメージ</a></li><li><a href="#toc35" tabindex="0">■ 注意点：if name == &#8220;main&#8221; の意味</a></li><li><a href="#toc36" tabindex="0">■ map()も使えます！</a></li><li><a href="#toc37" tabindex="0">■ どんなときに使うの？</a></li></ol></li><li><a href="#toc38" tabindex="0">8. 注意点とベストプラクティス</a><ol><li><a href="#toc39" tabindex="0">✅ 1. GILの影響に注意しよう（マルチスレッド）</a></li><li><a href="#toc40" tabindex="0">✅ 2. if __name__ == "__main__" を忘れずに（マルチプロセス）</a></li><li><a href="#toc41" tabindex="0">✅ 3. max_workersの数はほどほどに</a></li><li><a href="#toc42" tabindex="0">✅ 4. 戻り値を忘れずに扱おう（Future）</a></li><li><a href="#toc43" tabindex="0">✅ 5. デバッグしづらいので print で確認しよう</a></li></ol></li><li><a href="#toc44" tabindex="0">9. まとめ</a><ol><li><a href="#toc45" tabindex="0">🔁 おさらいポイント</a></li><li><a href="#toc46" tabindex="0">🛠 実務でも使えるシーン</a></li><li><a href="#toc47" tabindex="0">🤝 初心者にもやさしい！</a></li><li><a href="#toc48" tabindex="0">✅ あわせて読みたい</a></li></ol></li><li><a href="#toc49" tabindex="0">よくある質問（Q&amp;A）</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">1. はじめに｜Pythonの処理を高速化したい人へ</span></h2>



<p>Pythonでプログラムを書いていると、</p>



<p>「処理が遅い…」<br>「for文で順番に回しているのが限界に感じる」<br>「待ち時間が多くて、もっと効率よくできないの？」</p>



<p>と感じる場面はありませんか？</p>



<p>たとえば、</p>



<ul class="wp-block-list">
<li>大量データを処理するバッチ処理</li>



<li>Webスクレイピングで複数ページを取得するとき</li>



<li>APIのレスポンス待ちが続く処理</li>
</ul>



<p>こうしたケースでは、**処理を「同時に進められるかどうか」**が、実行時間を大きく左右します。</p>



<p>そこで役立つのが、**Pythonの「並列処理・並行処理」**です。<br>処理を1つずつ順番に実行するのではなく、複数のタスクを同時に扱うことで、体感できるレベルで高速化できることも珍しくありません。</p>



<p>とはいえ、</p>



<ul class="wp-block-list">
<li>並列処理と並行処理の違いがよく分からない</li>



<li>マルチスレッドとマルチプロセスって何が違うの？</li>



<li>難しそうで手を出しづらい…</li>
</ul>



<p>と感じている方も多いはずです。</p>



<p>安心してください。<br>Pythonには <strong><code>concurrent.futures</code></strong> という標準ライブラリがあり、複雑な仕組みを意識しなくても、<strong>初心者でも安全にマルチスレッド・マルチプロセスを扱える</strong>ようになっています。</p>



<p>この記事では、</p>



<ul class="wp-block-list">
<li>「並列処理」と「並行処理」の違い</li>



<li>マルチスレッドとマルチプロセスの使い分け</li>



<li><code>concurrent.futures</code> を使った具体的な書き方</li>
</ul>



<p>を、<strong>for文に慣れてきた人が次のステップに進めるレベル感</strong>で、やさしく解説していきます。</p>



<p>「Pythonをもっと速く動かしたい」<br>「処理時間のストレスから解放されたい」</p>



<p>そんな方は、ぜひ最後まで読み進めてみてください。</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>まずは、<strong>Pythonの標準的な処理の流れ</strong>である「<strong>逐次処理（ちくじしょり）</strong>」について確認しておきましょう。</p>



<h3 class="wp-block-heading"><span id="toc3">■ 逐次処理ってなに？</span></h3>



<p>逐次処理とは、<strong>コードが上から順番にひとつずつ実行される流れ</strong>のことです。Pythonで普通にプログラムを書くと、たいていはこの逐次処理になります。</p>



<p>たとえば、こんなコードを見てみましょう。</p>



<pre class="wp-block-preformatted"><code>print("1つ目の処理")<br>print("2つ目の処理")<br>print("3つ目の処理")<br></code></pre>



<p>この場合、実行すると</p>



<pre class="wp-block-preformatted"><code>1つ目の処理<br>2つ目の処理<br>3つ目の処理<br></code></pre>



<p>というように、上から順に一つずつ表示されます。これが「逐次処理」です。</p>



<h3 class="wp-block-heading"><span id="toc4">■ どんなイメージ？</span></h3>



<p>イメージとしては、<strong>1人の作業者が1つの仕事を終えてから次の仕事に取りかかる</strong>ようなものです。たとえば、</p>



<ul class="wp-block-list">
<li>料理を作る → 食器を洗う → 掃除をする</li>
</ul>



<p>というように、一つずつ順番に片づけていく流れです。</p>



<h3 class="wp-block-heading"><span id="toc5">■ どんなときに困る？</span></h3>



<p>逐次処理はシンプルで分かりやすいのですが、<strong>時間がかかる作業が途中にあると、そのあとの処理が全部待たされてしまう</strong>という欠点があります。</p>



<p>たとえば、</p>



<ul class="wp-block-list">
<li>Webサイトにアクセスしてデータを取得（5秒）</li>



<li>データを表示（1秒）</li>
</ul>



<p>という2つの作業があると、最初の「5秒」が終わらないと次に進めません。</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>こういった場合、<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="toc6">3. 並列処理と並行処理の違いをわかりやすく解説</span></h2>



<p>ここからは、Pythonで処理を効率よく進めるためのキーワードである「<strong>並列処理</strong>」と「<strong>並行処理</strong>」の違いについて説明します。</p>



<p>この2つ、言葉は似ているけど<strong>意味と使い方がちょっと違う</strong>ので、イメージでしっかり理解しておきましょう！</p>



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



<h3 class="wp-block-heading"><span id="toc7">■ 並列処理（へいれつしょり）とは？</span></h3>



<p><strong>並列処理</strong>は、<strong>複数の作業を同時に実行すること</strong>を指します。</p>



<p>たとえば、以下のような状況を想像してみてください。</p>



<p>🍳 Aさんが料理、Bさんが掃除、Cさんが洗濯を「同時に」やっている。</p>



<p>つまり、<strong>3人がそれぞれ別の作業を同時にしている</strong>イメージです。これが並列処理です。</p>



<p>Pythonでは「<strong>マルチプロセス</strong>」という仕組みを使って、この並列処理を実現します。</p>



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



<h3 class="wp-block-heading"><span id="toc8">■ 並行処理（へいこうしょり）とは？</span></h3>



<p>一方、<strong>並行処理</strong>は、<strong>1人の作業者が、うまくタイミングを調整して複数の作業を少しずつこなすこと</strong>を指します。</p>



<p>例えば…</p>



<p>🧍‍♂️Aさんが、鍋を煮込んでいる間に床を掃除し、さらに洗濯機が止まるのを待ちながらアイロンがけをしている。</p>



<p>つまり、<strong>ひとつの作業の「待ち時間」を使って、別の作業を進めている</strong>感じです。</p>



<p>Pythonでは、「<strong>マルチスレッド</strong>」という仕組みを使って、この並行処理を行います。</p>



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



<h3 class="wp-block-heading"><span id="toc9">■ 並列 vs 並行：まとめると？</span></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>分類</th><th>イメージ</th><th>Pythonで使う技術</th><th>向いている処理</th></tr></thead><tbody><tr><td>並列処理</td><td>複数人が同時に作業</td><td>マルチプロセス</td><td>計算量の多い処理（CPUバウンド）</td></tr><tr><td>並行処理</td><td>1人が作業の合間に別の仕事をする</td><td>マルチスレッド</td><td>待ち時間のある処理（I/Oバウンド）</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の「マルチスレッド」と「マルチプロセス」が<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>前の章で「並列処理＝マルチプロセス」「並行処理＝マルチスレッド」と紹介しましたね。<br>では実際に、**マルチスレッドとマルチプロセスはどこが違って、どう使い分ければいいのか？**をもう少し具体的に見ていきましょう。</p>



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



<h3 class="wp-block-heading"><span id="toc11">■ そもそも「プロセス」と「スレッド」ってなに？</span></h3>



<p>まずは言葉の定義をシンプルに説明します。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>用語</th><th>説明</th></tr></thead><tbody><tr><td><strong>プロセス</strong></td><td>コンピューター上で動いているアプリやプログラムの単位のこと。Pythonでスクリプトを実行すると1つのプロセスになります。</td></tr><tr><td><strong>スレッド</strong></td><td>プロセスの中で動く、さらに小さな実行単位。1つのプロセスの中で複数のスレッドを同時に動かすことができます。</td></tr></tbody></table></figure>



<p>ざっくり言えば、<strong>プロセスはアプリ本体、スレッドはその中で同時に動く作業員</strong>といったイメージです。</p>



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



<h3 class="wp-block-heading"><span id="toc12">■ マルチスレッドの特徴と使いどころ</span></h3>



<p><strong>マルチスレッド</strong>は、1つのプロセス内で<strong>複数のスレッドを動かす処理方法</strong>です。</p>



<h4 class="wp-block-heading"><span id="toc13">✅ メリット</span></h4>



<ul class="wp-block-list">
<li><strong>メモリ消費が少ない</strong>（プロセスを増やさないから）</li>



<li><strong>データ共有が簡単</strong>（同じメモリ空間で動くため）</li>
</ul>



<h4 class="wp-block-heading"><span id="toc14">⚠ デメリット</span></h4>



<ul class="wp-block-list">
<li>Pythonでは「<strong>GIL（グローバルインタプリタロック）</strong>」という仕組みがあるため、<strong>CPUをたくさん使う処理にはあまり向いていません</strong></li>
</ul>



<h4 class="wp-block-heading"><span id="toc15">💡 向いている処理（I/Oバウンド）</span></h4>



<ul class="wp-block-list">
<li>ネットワーク通信（APIアクセス、Webクローリングなど）</li>



<li>ファイル読み書き</li>



<li>データベースとのやりとり　など</li>
</ul>



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



<h3 class="wp-block-heading"><span id="toc16">■ マルチプロセスの特徴と使いどころ</span></h3>



<p><strong>マルチプロセス</strong>は、<strong>複数のPythonプロセスを立ち上げて同時に処理を進める方法</strong>です。</p>



<h4 class="wp-block-heading"><span id="toc17">✅ メリット</span></h4>



<ul class="wp-block-list">
<li>各プロセスが独立しているので、<strong>GILの制限を受けずにCPUをフル活用できる</strong></li>



<li><strong>重たい計算処理に強い</strong></li>
</ul>



<h4 class="wp-block-heading"><span id="toc18">⚠ デメリット</span></h4>



<ul class="wp-block-list">
<li><strong>メモリを多く消費</strong>する</li>



<li>プロセス間での<strong>データ共有がやや面倒</strong></li>
</ul>



<h4 class="wp-block-heading"><span id="toc19">💡 向いている処理（CPUバウンド）</span></h4>



<ul class="wp-block-list">
<li>数値計算（例：画像処理、機械学習の前処理など）</li>



<li>シミュレーション処理</li>



<li>複雑なアルゴリズムの計算　など</li>
</ul>



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



<h3 class="wp-block-heading"><span id="toc20">■ どっちを使えばいいの？</span></h3>



<p>簡単な目安としては以下のように考えましょう。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>処理のタイプ</th><th>おすすめ</th></tr></thead><tbody><tr><td><strong>待ち時間が多い処理（I/Oバウンド）</strong></td><td>マルチスレッド（<code>ThreadPoolExecutor</code>）</td></tr><tr><td><strong>CPUをたくさん使う処理（CPUバウンド）</strong></td><td>マルチプロセス（<code>ProcessPoolExecutor</code>）</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コードで「<code>concurrent.futures</code>」を使ってマルチスレッドを実装してみましょう！</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="toc21">5. concurrent.futuresとは？｜初心者にやさしい並列処理モジュール</span></h2>



<p>ここまで読んで、「マルチスレッドとマルチプロセスって便利そう！」と思った方も多いのではないでしょうか？<br>でも実際にコードで使おうとすると、<code>threading</code>や<code>multiprocessing</code>モジュールは、ちょっとややこしい構文が多くて混乱しやすいんですよね。</p>



<p>そんなときに使いたいのが、**<code>concurrent.futures</code>**モジュールです！</p>



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



<h3 class="wp-block-heading"><span id="toc22">■ concurrent.futuresってなに？</span></h3>



<p><code>concurrent.futures</code>は、<strong>Python 3.2から使える標準モジュール</strong>で、<br>「<strong>マルチスレッド</strong>」と「<strong>マルチプロセス</strong>」の両方を<strong>ほぼ同じ書き方で扱える</strong>という、超便利な仕組みです。</p>



<p>むずかしい用語を覚えなくても、たった数行で並列・並行処理ができちゃいます！</p>



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



<h3 class="wp-block-heading"><span id="toc23">■ 2つのExecutorクラスがポイント！</span></h3>



<p>このモジュールの主役は、次の2つのクラスです：</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>クラス名</th><th>内容</th></tr></thead><tbody><tr><td><code>ThreadPoolExecutor</code></td><td>スレッドを使った並行処理</td></tr><tr><td><code>ProcessPoolExecutor</code></td><td>プロセスを使った並列処理</td></tr></tbody></table></figure>



<p>どちらも「Executor（実行者）」という名前の通り、処理を並べて実行してくれる<strong>便利屋さん</strong>のような存在です。</p>



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



<h3 class="wp-block-heading"><span id="toc24">■ どんな書き方をするの？</span></h3>



<p>基本の構文はとってもシンプルです：</p>



<pre class="wp-block-preformatted"><code>from concurrent.futures import ThreadPoolExecutor<br><br>def my_task(n):<br>    # 何らかの処理<br>    return n * 2<br><br>with ThreadPoolExecutor(max_workers=2) as executor:<br>    future = executor.submit(my_task, 10)<br>    result = future.result()<br>    print(result)  # → 20<br></code></pre>



<p>このように、</p>



<ul class="wp-block-list">
<li><code>submit()</code>で関数を非同期に実行</li>



<li><code>result()</code>で結果を受け取る</li>
</ul>



<p>という流れが基本です。<br>さらに、複数のデータを一気に処理したいときは<code>map()</code>関数が使えます。</p>



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



<h3 class="wp-block-heading"><span id="toc25">■ なにがそんなに便利なの？</span></h3>



<ol class="wp-block-list">
<li><strong>同じ書き方でスレッドもプロセスも切り替えられる</strong></li>



<li><code>with</code>構文でリソース管理がラク</li>



<li>直感的に書けて初心者にもわかりやすい</li>
</ol>



<p>「まずは処理を速くしたい！」という人にとって、<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="toc26">6. ThreadPoolExecutorの使い方</span></h2>



<p>ここからは、実際にPythonで<strong>スレッドによる並行処理</strong>を実装してみましょう。使うのはもちろん、<code>concurrent.futures</code>の中の**<code>ThreadPoolExecutor</code>**です。</p>



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



<h3 class="wp-block-heading"><span id="toc27">■ 処理の流れをざっくり説明すると…</span></h3>



<ol class="wp-block-list">
<li>実行したい関数を用意する</li>



<li><code>ThreadPoolExecutor</code>で「作業者」を用意する</li>



<li><code>submit()</code>や<code>map()</code>で関数を並行実行する</li>



<li><code>result()</code>で結果を受け取る</li>
</ol>



<p>この4ステップだけでOK！</p>



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



<h3 class="wp-block-heading"><span id="toc28">■ まずは基本のコードから</span></h3>



<pre class="wp-block-preformatted"><code>from concurrent.futures import ThreadPoolExecutor<br>import time<br><br># 処理する関数<br>def slow_task(n):<br>    print(f"処理中: {n}")<br>    time.sleep(2)<br>    return n * 10<br><br># スレッドで並行実行<br>with ThreadPoolExecutor(max_workers=2) as executor:<br>    future1 = executor.submit(slow_task, 1)<br>    future2 = executor.submit(slow_task, 2)<br><br>    # 処理の完了を待って結果を取得<br>    result1 = future1.result()<br>    result2 = future2.result()<br><br>    print("結果1:", result1)<br>    print("結果2:", result2)<br></code></pre>



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



<h3 class="wp-block-heading"><span id="toc29">■ 実行結果のイメージ</span></h3>



<pre class="wp-block-preformatted"><code>処理中: 1<br>処理中: 2<br>（2秒後）<br>結果1: 10<br>結果2: 20<br></code></pre>



<p>ここでは「max_workers=2」としているので、<strong>2つの処理が同時に動いている</strong>のがわかります。</p>



<p>もし<code>max_workers=1</code>だったら、1つずつ順番に動く「逐次処理」になってしまいます。</p>



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



<h3 class="wp-block-heading"><span id="toc30">■ map()を使うともっとスッキリ！</span></h3>



<p>同じ関数を複数の引数で処理したいなら、<code>map()</code>を使うととてもスマートです。</p>



<pre class="wp-block-preformatted"><code>with ThreadPoolExecutor(max_workers=3) as executor:<br>    results = executor.map(slow_task, [1, 2, 3])<br>    for r in results:<br>        print("結果:", r)<br></code></pre>



<p>これだけで、<strong>3つのタスクを並行で実行し、順に結果を受け取れます。</strong></p>



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



<h3 class="wp-block-heading"><span id="toc31">■ こんなときに便利！</span></h3>



<ul class="wp-block-list">
<li>複数のWeb APIにアクセスするとき</li>



<li>複数のファイルを読み書きするとき</li>



<li>複数の画像やPDFを処理するとき</li>
</ul>



<p>I/Oが多い場面では、スレッドで**「待っている間に別の作業」**をするだけで、処理時間が大きく短縮できます。</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="toc32">7. ProcessPoolExecutorの使い方</span></h2>



<p>前の章では、スレッドを使って「待ち時間のある処理（I/Oバウンド）」を並行して実行する方法を紹介しました。<br>今度は、<strong>複数のプロセスを使って計算を速くする</strong>「<strong>ProcessPoolExecutor</strong>」の使い方を見ていきましょう！</p>



<p>実は…<strong>書き方はほぼ同じ！</strong><br><code>ThreadPoolExecutor</code>を<code>ProcessPoolExecutor</code>に変えるだけでOKなんです！</p>



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



<h3 class="wp-block-heading"><span id="toc33">■ 基本の使い方（コード例）</span></h3>



<pre class="wp-block-preformatted"><code>from concurrent.futures import ProcessPoolExecutor<br>import time<br><br># CPUを使う処理（たとえば重たい計算）<br>def heavy_task(n):<br>    print(f"処理中: {n}")<br>    time.sleep(2)<br>    return n * n<br><br># プロセスで並列実行<br>if __name__ == "__main__":<br>    with ProcessPoolExecutor(max_workers=2) as executor:<br>        future1 = executor.submit(heavy_task, 3)<br>        future2 = executor.submit(heavy_task, 5)<br><br>        result1 = future1.result()<br>        result2 = future2.result()<br><br>        print("結果1:", result1)<br>        print("結果2:", result2)<br></code></pre>



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



<h3 class="wp-block-heading"><span id="toc34">■ 実行結果のイメージ</span></h3>



<pre class="wp-block-preformatted"><code>処理中: 3<br>処理中: 5<br>（2秒後）<br>結果1: 9<br>結果2: 25<br></code></pre>



<p>この例でも、「max_workers=2」としているので、<strong>2つのプロセスが並列に動いて</strong>処理時間が短くなっています。</p>



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



<h3 class="wp-block-heading"><span id="toc35">■ 注意点：if name == &#8220;main&#8221; の意味</span></h3>



<p>WindowsやMacでこのコードを動かすときは、必ず次のように書いてください👇</p>



<pre class="wp-block-preformatted"><code>if __name__ == "__main__":<br>    # ここに処理を書く<br></code></pre>



<p>これは、「このファイルが直接実行されたときだけ中身を動かす」というPythonの決まりです。<br>マルチプロセスでこれを書かないと、<strong>無限にプロセスが増えるバグが起きることもある</strong>ので要注意です！</p>



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



<h3 class="wp-block-heading"><span id="toc36">■ map()も使えます！</span></h3>



<p>複数の引数に対してまとめて処理したい場合は、<code>map()</code>も使えます。</p>



<pre class="wp-block-preformatted"><code>if __name__ == "__main__":<br>    with ProcessPoolExecutor(max_workers=3) as executor:<br>        results = executor.map(heavy_task, [1, 2, 3])<br>        for r in results:<br>            print("結果:", r)<br></code></pre>



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



<h3 class="wp-block-heading"><span id="toc37">■ どんなときに使うの？</span></h3>



<ul class="wp-block-list">
<li>画像や動画などの重いファイルを一括処理したいとき</li>



<li>数値計算が多い処理を高速化したいとき</li>



<li>AIモデルや統計計算の前処理　など</li>
</ul>



<p>とにかく「<strong>CPUをよく使う処理</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="toc38">8. 注意点とベストプラクティス</span></h2>



<p>ここまでで、Pythonで<strong>マルチスレッド</strong>（ThreadPoolExecutor）と<strong>マルチプロセス</strong>（ProcessPoolExecutor）を使って、処理を効率よく並列・並行に実行する方法を学びました。</p>



<p>でも、実際のプログラムに取り入れる前に、<strong>知っておくとトラブルを防げるポイント</strong>があります。</p>



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



<h3 class="wp-block-heading"><span id="toc39">✅ 1. GILの影響に注意しよう（マルチスレッド）</span></h3>



<p>Pythonには「**GIL（グローバルインタプリタロック）」**という仕組みがあります。</p>



<p>これは、<strong>1つのPythonプロセスで同時に複数のスレッドが実行されないように制限をかける仕組み</strong>です。</p>



<ul class="wp-block-list">
<li>**I/Oが多い処理（API、ファイル読み書き）**には問題ありません。</li>



<li>でも、<strong>CPUをたくさん使う重たい処理</strong>だと、スレッドを増やしてもあまり速くなりません。</li>
</ul>



<p>そういうときは、**ProcessPoolExecutor（マルチプロセス）**のほうが効果的です。</p>



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



<h3 class="wp-block-heading"><span id="toc40">✅ 2. if __name__ == "__main__" を忘れずに（マルチプロセス）</span></h3>



<p>マルチプロセスでコードを書くときは、<strong>必ず</strong>このブロックで実行部分を囲みましょう。</p>



<pre class="wp-block-preformatted"><code>if __name__ == "__main__":<br>    # 並列処理のコードはここに書く<br></code></pre>



<p>これは特に<strong>WindowsやMacで重要</strong>です。これを忘れると、プログラムが予期せず再帰的に自分を呼び出して、<strong>無限ループやクラッシュの原因になります</strong>。</p>



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



<h3 class="wp-block-heading"><span id="toc41">✅ 3. max_workersの数はほどほどに</span></h3>



<p><code>max_workers</code>でワーカー数（同時に動かす処理の数）を指定できますが、<strong>多すぎると逆に遅くなる</strong>ことがあります。</p>



<ul class="wp-block-list">
<li>目安は、マルチプロセスなら「CPUのコア数」、マルチスレッドなら「処理の待ち時間に応じて」</li>



<li>コア数は、次のコードで確認できます：</li>
</ul>



<pre class="wp-block-preformatted"><code>import os<br>print(os.cpu_count())  # 例: 8<br></code></pre>



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



<h3 class="wp-block-heading"><span id="toc42">✅ 4. 戻り値を忘れずに扱おう（Future）</span></h3>



<p><code>submit()</code>で実行した処理は、<strong><code>Future</code>オブジェクト</strong>として返ってきます。これをちゃんと<code>result()</code>で受け取らないと、<strong>処理が終わったかどうかわからない</strong>まま次に進んでしまうことがあります。</p>



<pre class="wp-block-preformatted"><code>future = executor.submit(task, 10)<br>result = future.result()  # 処理の完了を待って結果を取得<br></code></pre>



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



<h3 class="wp-block-heading"><span id="toc43">✅ 5. デバッグしづらいので print で確認しよう</span></h3>



<p>並列・並行処理では、処理の順番がバラバラになることがあります。<br>そのため、どの処理が今どこで動いているのか、<strong>print文でログを出しておくと安心</strong>です。</p>



<pre class="wp-block-preformatted"><code>print(f"タスク{n}を開始します")<br></code></pre>



<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>以上のポイントを押さえておけば、<code>concurrent.futures</code>を使った並列・並行処理を<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="toc44">9. まとめ</span></h2>



<p>今回は、Pythonの処理を効率化・高速化する方法として「<strong>並列処理と並行処理</strong>」、そしてそれをシンプルに実装できる「<strong>concurrent.futures</strong>モジュール」について解説してきました。</p>



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



<h3 class="wp-block-heading"><span id="toc45">🔁 おさらいポイント</span></h3>



<ul class="wp-block-list">
<li><strong>逐次処理</strong>は、処理を1つずつ順番に実行するやり方。簡単だけど待ち時間がネックになる。</li>



<li>**並列処理（マルチプロセス）**は、複数のプロセスを同時に動かして、**計算が重い処理（CPUバウンド）**を速くする方法。</li>



<li>**並行処理（マルチスレッド）**は、待ち時間の合間に他の作業を進めて、**I/O待ちの処理（APIやファイル操作）**を効率よくこなす方法。</li>



<li><code>concurrent.futures</code>を使えば、どちらの方式も<strong>同じような書き方で簡単に実装できる</strong>！</li>
</ul>



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



<h3 class="wp-block-heading"><span id="toc46">🛠 実務でも使えるシーン</span></h3>



<ul class="wp-block-list">
<li>Webスクレイピングで複数ページを同時取得</li>



<li>複数のファイルを並行して読み込み・変換</li>



<li>複雑な数値処理をマルチプロセスで高速化</li>



<li>バックグラウンド処理を簡単に導入　など</li>
</ul>



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



<h3 class="wp-block-heading"><span id="toc47">🤝 初心者にもやさしい！</span></h3>



<p>難しそうに思える「並列・並行処理」も、<code>concurrent.futures</code>を使えば<strong>たった数行のコードで実現</strong>できます。</p>



<p>最初は小さな処理からでもいいので、ぜひ実際に試してみてください。<br>「時間がかかっていたあの処理、こんなに速くなるのか！」ときっと驚くはずです。</p>



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



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



<p>以下の記事もあわせて読むことで、Pythonの処理効率や実用スキルをさらに高めることができます！</p>



<ul class="wp-block-list">
<li>🔗 <a target="_blank" href="https://python.cbagames.jp/2025/06/14/python-debugger-breakpoint/">Pythonのデバッガー（breakpoint関数）の使い方｜初心者でも試せるデバッグ入門</a><br>　→ 並列処理でうまく動かないときの原因追跡に便利！</li>



<li>🔗 <a target="_blank" href="https://python.cbagames.jp/2025/06/16/python-higher-order-functions/">Pythonの高階関数（map・filter・reduce）の使い方と実例</a><br>　→ <code>concurrent.futures.map()</code>と関連して、map関数の基本理解に役立ちます。</li>



<li>🔗 <a target="_blank" href="https://python.cbagames.jp/2025/06/15/python-matplotlib-graph-beginner/">Pythonでグラフ描画｜Matplotlibの使い方解説</a><br>　→ 処理結果の可視化や、並列で処理したデータの表示に活用できます。</li>



<li>🔗 <a target="_blank" href="https://python.cbagames.jp/2025/06/04/web-scraping-requests-beautifulsoup/">PythonでWebスクレイピングを自動化！Beautiful SoupとRequestsの基本</a><br>　→ 並行処理を使うことで、Webスクレイピングの高速化が可能になります。</li>
</ul>



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



<h2 class="wp-block-heading"><span id="toc49">よくある質問（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">並列処理と並行処理の違いって何ですか？</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>で実現されます。並行処理は「1人が交互に複数の作業をこなす」イメージで、<strong>マルチスレッド</strong>で実現されます。処理の性質によって使い分けましょう。</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">ThreadPoolExecutorとProcessPoolExecutor、どっちを使えばいいの？</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>**待ち時間の多い処理（I/Oバウンド）**には<code>ThreadPoolExecutor</code></p>



<p>**計算量の多い処理（CPUバウンド）**には<code>ProcessPoolExecutor</code><br>が向いています。</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"><code>submit()</code>と<code>map()</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>submit()</code>は<strong>1つずつ処理を追加できる</strong>方法で、<code>Future</code>を使って戻り値を受け取れます。</p>



<p><code>map()</code>は<strong>リストや複数の値を一括で処理する</strong>のに向いていて、簡潔に書けます。</p>
</div></dd></dl></div>
]]></content:encoded>
					
					<wfw:commentRss>https://python.cbagames.jp/2025/06/21/python-concurrent-futures-multithread-multiprocess/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
