メモリフットプリントの比較:GolangとPythonで同一のWebサービスワークロードを実行する
GOは、言語設計と並行性モデルの違いにより、Webサービスを実行するときにPythonよりも大幅に少ないメモリを使用します。 Goのゴルチンは、最小限のスタックオーバーヘッドで軽量で、数千の接続を効率的に処理できるようになります。そのゴミコレクターは、低遅延のために最適化されており、メモリ管理のオーバーヘッドを減らします。静的バイナリは、通訳層を排除し、メモリの使用量をさらに最小限に抑えます。対照的に、Pythonのスレッドまたはコルーチンはより多くのオーバーヘッドを運びます。動的タイピングはオブジェクトメモリフットプリントを増加させ、GILは多くの場合、複数のプロセスを必要とし、メモリ消費を増やします。高い並行性では、GOサービスはPythonの100〜200MBと比較して30〜50MBを使用する場合があります。ただし、Pythonの生産性の利点は、小規模なアプリケーションまたは開発者の効率が重要な場合のI/Oバインドワークロードでのメモリ使用量が高い場合があります。
Webサービスを実行するためにGolangとPythonのいずれかを選択するとき、より実用的な懸念の1つは、メモリ使用法、つまり「メモリフットプリント」です。両方の言語で同一のワークロードを展開している場合、違いはかなり厳しい場合があります。

通常に見るものは次のとおりです。同じ種類のワークロードを提供するときに、Pythonよりも大幅に少ないメモリを使用する傾向があります。その理由は、言語設計、ランタイムの動作、およびそれぞれが同時性をどのように処理するかに根ざしています。

Golangがより少ないメモリを使用する理由
GOは、システムプログラミングを念頭に置いて設計されており、そのパフォーマンス特性に明確に表示されます。 GoでWebサービスを実行したとき:
- ゴルチンは軽量です。各ゴルウチンは小さなスタック(デフォルトでは2kb)から始まり、必要に応じて成長します。数千の同時接続は、他の言語でスレッドやプロセスが行う方法をメモリしません。
- ゴミコレクターは、低レイテンシと効率のために最適化されています。Pythonの参照カウントシステムほど積極的にクリーンアップすることはありません。
- 静的バイナリと最小限のランタイム依存関係は、プロセスの上に座っている通訳層がないことを意味します。
これらはすべて、同等のPythonサービスと比較してGOベースのWebサーバーを実行している場合、はるかに無駄のないプロセスになります。

Pythonがより多くのメモリを使用させる理由
Pythonのシンプルさと柔軟性は、メモリに関しては犠牲になります。 Pythonで同じロジックを実行すると、通常、メモリ消費が高くなります。
- 各スレッドまたは非同期ワーカーは、GeventまたはAsyncioでGunicornを使用しているかどうかにかかわらず、より多くのオーバーヘッドを運びます。各接続またはCoroutineは、ゴルチンよりも多くのメモリを必要とします。
- 動的なタイピングとオブジェクトモデルはメモリが多いです。整数や文字列などの基本的なオブジェクトでさえ、コンパイルされた言語で対応するよりもPythonでより多くのスペースを占有します。
- プロセスごとの通訳オーバーヘッド:Pythonのグローバルインタープリターロック(GIL)は、多くの場合、メモリ使用量を掛けるために複数のプロセスを拡大する必要があることを意味します。
同じことを行っているGOマイクロサービスの隣にフラスコまたはDjangoアプリを展開したことがある場合は、Pythonバージョンが同様の負荷で10倍または100倍以上のRAMを使用していることに気付いたかもしれません。
現実的な比較セットアップ
公正な比較を得るために、人々はしばしばテストします:
- 最小限の処理を行う単純なHTTPエンドポイント(JSONの返却など)。
- 両方のサービスは、同じ数のリクエストを1秒間に処理します。
- Trafficをシミュレートするための
wrk
やab
などのロードテストツール。 - RSS(常駐セットサイズ)または
top
またはhtop
介した仮想メモリを測定します。
例えば:
- 標準の
net/http
パッケージを使用したGOサービスは、負荷の前に5〜10MBのメモリに座る場合があります。 - Flask Werkzeugを使用したPythonサービスは、フレームワークのインポートから20〜40MB前後に開始できます。
負荷下では、ギャップが広がります。 100の同時リクエストで:
- GOは30〜50MB前後にピークに達する可能性があります。
- Pythonは、何人の労働者が走っているかに応じて、100〜200MB以上にヒットする可能性があります。
Pythonのより高いフットプリントが重要ではない場合
とはいえ、Pythonのメモリオーバーヘッドは必ずしも契約を破るとは限りません。控えめなトラフィックを備えた内部ツール、プロトタイプ、またはアプリの場合、開発者の生産性の向上と比較して、余分なRAMの使用が無視できます。
また:
- サービスがI/O(データベースや外部APIなど)でほとんどの時間を待つ時間を費やしている場合、Pythonのメモリ使用はボトルネックになりません。
-
uvicorn
(ASGIを使用)やgunicorn
meinheld
などのツールでPythonアプリを最適化して、メモリを削減し、スループットを改善できます。
しかし、ハイスループットAPIやマイクロサービスのように、水平方向にスケーリングする必要があるものを構築する場合は、GOの低いメモリフットプリントが真の利点になります。
ええ、GOは、同等のWebサービスを実行しているときに、生のメモリ効率でハンダウンを獲得します。 Pythonは使いやすさとエコシステムを補いますが、サーバーのコストを低く抑えるか、限られたリソースをより絞り出すことを気にするなら、Goの無駄のないランタイムは明確なエッジを与えます。
そして、それは基本的にそれです。
以上がメモリフットプリントの比較:GolangとPythonで同一のWebサービスワークロードを実行するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undress AI Tool
脱衣画像を無料で

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

Python仮想環境を作成するには、VENVモジュールを使用できます。手順は次のとおりです。1。プロジェクトディレクトリを入力して、python-mvenvenv環境を実行して環境を作成します。 2。SourceENV/bin/Activate to Mac/LinuxおよびEnv \ Scripts \ Windowsにアクティブ化します。 3. PIPINSTALLインストールパッケージ、PIPFREEZE> RECUMESSION.TXTを使用して、依存関係をエクスポートします。 4.仮想環境をGITに提出しないように注意し、設置中に正しい環境にあることを確認してください。仮想環境は、特にマルチプロジェクト開発に適した競合を防ぐためにプロジェクト依存関係を分離でき、PycharmやVSCodeなどの編集者も

UseURLpathversioninglike/api/v1forclear,routable,anddeveloper-friendlyversioning.2.Applysemanticversioningwithmajorversions(v1,v2)only,avoidingmicro-versionslikev1.1topreventroutingcomplexity.3.OptionallysupportcontentnegotiationviaAcceptheadersifalr

fornewgo1.21プロジェクト、useSlogforofficialStructuredloggingsupport;

USETRACEMALLOCTOTRACKMEMORYALLOCATIONS ANDIDENTIFIFYMEMORYLINES; 2.monitorObjectCountSwithgcandobjgraphtodectectgrowingObjecttypes;

FlaskBluePrintを使用して、関数に従ってアプリケーションをモジュール化します。 1. user.pyでuser_bpを作成するなど、青写真インスタンスを作成し、ルートを定義します。 2。post.pyなどの別のファイルに他の青写真を作成します。 3。app.pyでインポートし、app.register_blueprint()で各blueprintを登録します。 4.実行後、対応するURLにアクセスしてモジュラールーティング効果を確認すると、コード構造はより明確でメンテナンスが簡単です。

usezoneinfoforpython3.9 to createtimezone-awaredateTimes andconvertimezones withastimezone(); 2.forpython3.6–3.8、usepytzwithlocalize()toavoiddStrurs;

辞書の値を並べ替えるには、sorted()関数を使用して、dict.items()とキーパラメーターと一致します。 1。lambdaitem:item [1]を使用して、昇順で並べ替えます。 2。逆の追加= trueを実装して降順順序を実装します。 3. operator.itemgetter(1)を使用してLambdaを置き換えて、読みやすさとパフォーマンスを向上させます。辞書は、Python 3.7の挿入順序を維持し、元の辞書は変更されておらず、新しい辞書を返します。値タイプが混合されている場合、追加の処理が必要であり、最終パターンはdict(sorted(d.items()、key = lambdax:x [1]))です。

__iter __()toreturntheiteratorobject、gultivativitalsforaseparateteratorintance.2.define__next __()toreturnthenextvalueandraisestopiteration weenex.tocreateareeusablecustomiterator、manageStatewithin__iter __(
