本文へスキップ

ZPL-0482 Python開発 実測 24/25

Pythonの標準機能と外部ライブラリを制約で比較するPrompt

技術選定を「考え始める」状態から「次の行動が決まる」状態へ。

環境・処理特性・保守条件を入力し、依存と実行方式を検証可能な選定表にします。

  • SAVE VALUE 4
  • 初級〜中級
  • 5〜20分
  • ChatGPT / Claude / Gemini

このPromptでできること

  • Python/OS、I/OかCPUか、既存依存と配布条件を入力すると、標準ライブラリ/外部パッケージ・同期/非同期の候補を比較し、採用前の小さなSpikeを設計します。

必要なもの(入力項目)

  • 実装する処理と入出力
  • Pythonバージョン・OS・実行/配布形態
  • 既存のpyproject/requirements・固定依存
  • データ量、I/O待ち・CPU負荷・同時処理要否
  • ネット接続の可否
  • チームの保守経験と運用期間
  • ライセンス/セキュリティ規定
  • 候補ライブラリ・公式URL

解決できる悩み

  • 技術選定で何を決めるべきか分からない
  • 一般論しか出ず、自分のケースに使えない
  • 重要な前提やリスクを見落とす
  • 結果を実行可能な形へ落とし込めない

こんな人向け

  • Pythonプログラマーの初心者
  • 実務を時短したい担当者
  • AIの出力を判断材料として使いたい人

使うタイミング

技術選定に着手する直前、既存案を見直すとき、または公開・実行前に抜け漏れを確認するとき。

プロンプト本文

{{ }} の部分を自分の情報に置き換えてから使ってください。

PROMPT
Python実装の技術選定を行います。『流行っている』ではなく、与えた環境で必要性を証明できる候補だけ残してください。

処理内容、入出力と外部接続:{{処理とI/O}}
対象Python/OS、実行・配布方法:{{Python・OS・配布}}
既存pyproject/requirementsと固定依存:{{既存依存}}
データ量、I/O待ち、CPU負荷、同時処理要否:{{負荷・並行性}}
オフライン/ネットワークの制約:{{ネットワーク制約}}
開発者の経験と保守期間:{{保守体制}}
ライセンス/セキュリティ/運用規定:{{規定}}
比較したい候補と公式URL:{{候補・公式URL}}

まず標準ライブラリのみの案と外部依存案を比較し、処理がI/O待ち主体かCPU主体かを分けて同期/非同期の必要性を判断する。asyncioを無条件に採用しない。候補ごとに対象Python/OS、依存、ライセンス、保守/脆弱性の確認場所、導入/削除コストを列にする。現行版・互換・セキュリティ状態をWebで実確認していなければ『未確認』と書き、検索できる場合は公式URLと確認日を記録。venvは再作成する環境、pyprojectのrequires-python/依存宣言と役割を区別する。

出力:候補比較表、暫定推奨と反証条件、15〜60分の小さなSpike(測る値と合否)、依存/環境記録方針、未確認事項。数値ベンチマークは実行していなければ作らない。

使い方

返ってくるもの

  • stdlib/外部・同期/非同期比較、暫定推奨、Spike、依存/環境記録、確認URL/日付

調整のしかた

「目的・利用者」を変更すると対象が変わり、「性能・セキュリティ制約」を具体化すると提案精度が上がります。

追加で投げると効く指示

  • 初心者向けに手順を細かくしてください
  • 上位3案を比較表にしてください
  • 不足情報だけ質問してください
  • リスクの高い順に並べてください

推奨モデル

コーディング能力・高推論モデル推奨

実測の入力と出力

下は実際にAIへ通したときの入力と、そのとき返ってきた出力です(モデル: gpt-5.1-thinking / 2026-09-16)。作例ではありません。

このとき入力した内容を見る
Python実装の技術選定を行います。『流行っている』ではなく、与えた環境で必要性を証明できる候補だけ残してください。

処理内容、入出力と外部接続:毎晩、社内の在庫CSV(約5万行・120MB)を読み込み、商品コードごとに在庫数を集計して、社内の REST API(1リクエスト1商品・約3,000商品)へ POST する。
対象Python/OS、実行・配布方法:Python 3.11 / Ubuntu 22.04 のサーバで cron 実行。配布はしない(サーバに git clone して venv で動かす)。
既存pyproject/requirementsと固定依存:requirements.txt に requests==2.31.0 だけ固定されている。pyproject.toml は無い。
データ量、I/O待ち、CPU負荷、同時処理要否:CSV 集計は数十秒で終わる(計測済み:pandas 無しの csv モジュールで 38秒)。API への POST が 3,000回×平均0.4秒で約20分かかっており、朝の業務開始(6時)までに終わらない日がある。API 側の同時接続上限は 10 と聞いている。
オフライン/ネットワークの制約:サーバから社内 API とPyPI には接続できる。
開発者の経験と保守期間:開発者は自分1人(Python 3年)。asyncio は使ったことが無い。今後2年は自分が保守する。
ライセンス/セキュリティ/運用規定:OSS ライセンスは MIT / BSD / Apache-2.0 なら可(社内規定)。脆弱性はリリース前に pip-audit を通す決まり。
比較したい候補と公式URL:候補:concurrent.futures.ThreadPoolExecutor(標準ライブラリ)、httpx(https://www.python-httpx.org/)、aiohttp(https://docs.aiohttp.org/)。

まず標準ライブラリのみの案と外部依存案を比較し、処理がI/O待ち主体かCPU主体かを分けて同期/非同期の必要性を判断する。asyncioを無条件に採用しない。候補ごとに対象Python/OS、依存、ライセンス、保守/脆弱性の確認場所、導入/削除コストを列にする。現行版・互換・セキュリティ状態をWebで実確認していなければ『未確認』と書き、検索できる場合は公式URLと確認日を記録。venvは再作成する環境、pyprojectのrequires-python/依存宣言と役割を区別する。

出力:候補比較表、暫定推奨と反証条件、15〜60分の小さなSpike(測る値と合否)、依存/環境記録方針、未確認事項。数値ベンチマークは実行していなければ作らない。
返ってきた出力を見る
結論

この処理は CPU主体ではなく、明確にI/O待ち主体です。CSV集計は実測38秒なのに対し、API部分は 3,000 × 平均0.4秒 ≈ 1,200秒 と約20分を占めています。したがって、今回必要なのはCSV高速化やプロセス並列化ではなく、HTTP POSTをAPI側上限10接続の範囲で重ねることです。

暫定推奨は ThreadPoolExecutor + Requests の同期HTTPです。ただし、現在固定されている requests==2.31.0 はそのままでは採用せず、互換性確認後に現行の修正版へ更新する前提です。asyncio/httpx.AsyncClient/aiohttp は技術的には成立しますが、同時実行が最大10で、開発者がasyncio未経験、2年間1人保守という条件では、現時点で追加複雑性を正当化できません。

Python 3.11自体についても注意があり、公式には現在 security maintenance で、サポート終了は 2027年10月です。2年間保守すると2028年まで届くため、別途Python 3.12以降への更新計画が必要です。 
Python.org

候補比較表

「標準ライブラリのみ」は厳密には urllib.request + ThreadPoolExecutor、「新規依存なし」は既存Requestsを使う案として分けます。

候補	I/O並行方式	Python 3.11 / Ubuntu 22.04	依存	ライセンス	現行版・セキュリティ確認 2026-09-16	保守コスト	導入 / 削除コスト	判定
urllib.request + ThreadPoolExecutor	同期HTTPを最大10スレッド	Python 3.11標準ライブラリで利用可。ThreadPoolExecutor はI/O待ちを重ねる用途を想定した仕組み。 
Python documentation
	新規PyPI依存0	Python本体はPSF License。MIT/BSD/Apache-2.0そのものではない。ただし既採用Pythonランタイムの一部。社内規定が標準ライブラリにも形式上適用されるなら要確認。 
Python documentation
	Python 3.11.16公式文書を確認。脆弱性管理はPython本体/Ubuntu側。	HTTPエラー、JSON、認証、接続再利用等を自前寄りに扱うため高め	導入小〜中。削除は容易	残すが第一候補ではない
既存 requests + ThreadPoolExecutor	同期HTTPを最大10スレッド	Requests現行版はPython >=3.10、3.11対応。OS Independent。 
PyPI
+1
	新規依存0。既存Requestsとそのtransitive deps	Apache-2.0。許可範囲。 
PyPI
	現行安定版は 2.34.2。一方、固定中の2.31.0は <2.32.0、<2.32.4、<2.33.0 を対象とする後発advisoryの範囲に入る。 
GitHub
+3
GitHub
+3
GitHub
+3
	低い。既存コード・経験をそのまま利用可能	最小。並列部分を戻せば容易に直列へ戻せる	暫定第一候補
HTTPX 0.28.1 + AsyncClient	asyncioによる非同期HTTP、Semaphore等で<=10	安定版0.28.1はPython >=3.8で3.11対応、OS Independent。 
PyPI
	httpcore、certifi、idna、async関連等を追加。 
PyPI
	BSD-3-Clause。許可範囲。 
PyPI
	安定版は 0.28.1 (2024-12-06)。GitHub Security Advisoriesには公開advisoryなし。現在は 1.0.dev6 (2026-08-31) までpre-releaseが進行しており、1.0系は再設計中。 
GitHub
+1
	中〜高。asyncio習得+1.0移行動向を追う必要	導入中。削除時にasyncコードを同期へ戻す必要	今回は見送り寄り
aiohttp 3.14.3	asyncioによる非同期HTTP、Semaphore/Connectorで<=10	最新安定版3.14.3はPython >=3.10、Python 3.11対応、POSIX対応。 
PyPI
	aiohappyeyeballs, aiosignal, attrs, frozenlist, multidict, propcache, yarl 等	Apache-2.0 AND MIT。両方とも許可範囲。 
PyPI
	最新安定版は 3.14.3 (2026-07-23)。<=3.14.2 のC response parserにHigh advisoryがあり、3.14.3で修正。 
GitHub
+1
	高め。asyncio+aiohttp固有API+依存数増加	導入中〜高。削除時async部分を書換え	今回は見送り

HTTPX、aiohttpともに「使えない」のではありません。問題はこの案件で必要かです。最大10並行程度ならOSスレッド10本は負荷として小さく、asyncの主な強みである「非常に多数の同時I/Oを少ないスレッドで扱う」必要がありません。

また、純標準ライブラリ案も性能上は成立し得ますが、すでにRequestsが存在する環境でHTTPクライアント部分まで urllib.request へ戻す理由が薄いです。接続再利用、タイムアウト、ステータス処理、JSON送受信、例外処理などの実装量を増やす方向になるためです。

暫定推奨

ThreadPoolExecutor(max_workers <= 10) + 更新したRequestsを第一候補とします。

構成としてはCSV読み込み・集計は現在の同期処理を維持し、集計後の約3,000商品のPOST部分だけをスレッドプールへ渡します。API側上限が10なので、Pythonのデフォルトworker数には任せず、アプリケーション側で明示的に上限を持つべきです。Python公式も ThreadPoolExecutor をI/Oを重ねる用途として説明しています。 
Python documentation

Requestsを使う場合、1個の Session を無条件に全スレッドで共有する設計にはせず、workerごとのSession/thread-local SessionをSpike候補にします。これなら各worker内でHTTP connection reuseを得つつ、共有可変状態を減らせます。

requests==2.31.0 は別途変更対象です。現行は2.34.2で、2.31.0以降にもTLS検証、.netrc、一部utilityに関する修正が出ています。特に社内ルールで pip-audit が必須なら、古い固定版の維持理由を先に解消する方がよいです。 
GitHub
+1

この推奨を反証する条件

次のどれかがSpikeで確認されたら、ThreadPoolExecutor案を再評価します。APIが同時リクエスト時に429/5xxや接続切断を頻発する、スレッド版で必要な締切を満たせない、将来的に同一プロセスで数百〜数千の同時HTTP処理へ拡大することが確定する、または既存システム全体がasyncioベースへ統一される場合です。

逆に、「asyncの方が新しい」「aiohttpの方が速そう」という理由だけでは変更しません。

15〜60分のSpike

コード全体を書き換えず、API送信部だけ比較します。できればステージングAPIを使用し、無ければPOSTが冪等かを確認してから同一在庫値を送る必要があります。

測定対象	測る値	合否
直列Requests	同一商品サンプルのwall time、成功数、4xx/5xx、timeout、p50/p95 latency	比較基準として記録
ThreadPool 5	同上+最大同時実行数	データ結果が直列と一致し、エラー率が悪化しない
ThreadPool 10	同上+最大同時実行数	in-flightが10を超えず、429/5xx/timeoutが許容範囲、結果一致
CPU/RAM	process CPU%、最大RSS	並列化で異常なCPU/RSS増大がない
接続再利用	新規接続数またはサーバログ/クライアントdebugで確認可能なら測定	3,000回すべてで新規TLS/TCP接続していないことが望ましい
総ジョブ時間予測	実測並列API時間 + 実測CSV時間 + retry余裕	06:00 - cron開始時刻以内なら性能合格

最後の条件だけは絶対値を今決められません。cronの開始時刻が提示されていないためです。ここを勝手に「5分以内」などとは設定しません。

Spikeではさらに、worker数を10固定と決め打ちする前に5と10を比較します。APIの平均応答時間が並行数とともに悪化するなら、6〜8程度の方が総時間や安定性で有利になる可能性があります。これは実測して決める部分です。

HTTPX/aiohttpまで同じSpikeで実装する必要はありません。まずThreadPoolExecutor版が締切・エラー率・保守性を満たせば、その時点でasync候補には必要性がないと判断できます。これが最小のSpikeです。

依存・環境記録方針

venv、requirements.txt、pyproject.toml は役割を分けます。

venv は再作成可能な実行環境であり、仕様や依存管理の原本にはしません。壊れたら削除して作り直せる状態にします。

pyproject.toml を導入するなら、ここにはプロジェクトとしての最低Python要件を置きます。今回なら将来の3.12移行を阻害しないよう、特別な3.11依存コードがなければ requires-python = ">=3.11" が自然です。「今のサーバが3.11」という事実と、「3.11以外では動かない」という互換性宣言は別物です。

依存宣言については、pyproject.toml と requirements.txt の両方を手編集して二重管理するのは避けます。小規模cronなら、当面 requirements.txt をデプロイ再現用の固定ファイルとして使い、採用版を明示的にpinする方法でも十分です。将来パッケージ化するなら pyproject.toml を論理依存の原本、別のlock/requirementsをデプロイ時の具体バージョン記録に分けます。

リリース証跡としては、最低でも python --version、pip freeze またはlock相当、OS情報、pip-audit結果、採用理由、Spike結果、API同時接続上限をGit管理下に残すのがよいです。

Requestsを継続するなら、まず新しいvenvで現行安定版2.34.2を入れて既存テストを通し、その後 pip-audit を実行する順序が妥当です。Requests 2.34.2はPython >=3.10で、Python 3.11は対象範囲です。 
PyPI
+1

未確認事項

cronの実際の開始時刻。これがないため「6時まで」という絶対性能の合否時間はまだ算出不可。

APIの「同時接続上限10」が、TCP connection数・同時request数・アカウント単位・サーバ全体のどれを意味するか。

429時の Retry-After、5xx/timeout時の推奨retry仕様。

POSTが冪等か。retry設計に直結するため重要。

APIがkeep-aliveを有効にしているか。

現行 requests==2.31.0 を固定している理由、および2.34.2への更新時の互換性。

pip-audit の実環境結果。Webでは既知advisoryを確認しましたが、今回のvenvに対して実際には実行していません。

HTTPX/aiohttpの全transitive dependencyのライセンス。トップレベルパッケージのライセンスは確認済みですが、社内規定が全依存に及ぶならlock後に一括確認が必要です。

Ubuntu 22.04上のPython 3.11がUbuntu公式パッケージ、deadsnakes、ソースビルド等のどれか。セキュリティ更新経路を記録する必要があります。

Python 3.11は2027年10月に公式サポート終了予定なので、2年保守期間中のPython 3.12+移行時期。 
Python.org

したがって現段階の技術選定は、**「asyncライブラリは採用保留。まずRequests更新可否を確認し、ThreadPoolExecutor 5/10並行のSpikeで締切適合を証明する」**まで確定してよい状態です。asyncioを導入するのは、この案が実測で反証された後で十分です。

この出力になっていれば成功

  • Python/OS互換と導入理由が検証可能
  • 保守負荷を示す
  • Spikeに合否がある
  • 未確認の現行情報を明示

使うときの注意

実行前にGit差分またはバックアップを確認し、テスト環境で検証してください。

候補URLや環境情報不足なら保留。未調査の最新版・安全性・性能値を断定しない。

参考にした一次情報: Python Docs / Stack Overflow

ZEN PROMPT LIBRARY

やりたいことから、
次のPromptを探す。