高性能読み取り、Pythonプログラミング

EDITORIAL

最近、私はこの本、読んで「のpython-パフォーマンスプログラミングを。」実際には、とき本はまだこの本のための大きな期待を持っているが、それを読んで、私が翻訳し、翻訳、右、感じて、本当に吸います。Chinglishは非常に流暢でなくても、いくつかの場所で、多くのことを言っていません。しかし、まだ英語の本よりも、いくつかの効率を参照してください確かに言えば、私の英語のような平均的な人のために高いです。第二に、本はPythonの最適化効率、コンピューティング性能と省スペースの方法を強化するよう指示、コンテンツの一部は、まだ非常に有益、ここでは簡単なチャットです。(書籍のプレゼンテーションとコンテンツの順に続いて、必ずしも同じではありませんが、内容のほとんどは、対応する本の中で見つけることができます)

Pythonの性能の限界

私は、大気モデルはまた、FORTRAN、いくつかのプログラミング言語、C、C ++を、持ち上げた時に学ばなければなりませんでした。しかし、これは動的言語を使用して、高い性能を達成するのは初めてです。様々な理由から、主にPythonは多くの作業を行うために使用される基本的な計算の要素を引き離すために、高レベル言語、Pythonインタプリタである、我々は実際に顔のpythonブラックボックスである、私たちの操作や計算を行うことができることを知っていますしかし、実装プロセスは、開発者に対して透過的ではありません。もう一つの理由は、「悪名高いGIL」で、スレッドセーフなグローバルインタプリタロックに導入Pythonインタプリタの開発です。
最初の質問については、影響はPythonなどによるベクトル演算は直接使用できませんが、実際には、我々はこれを達成numpyの外部ライブラリを使用することができ、これは根本的な問題ではないことを、仮想マシンの影響に、より直感的に起因する。加えて、問題は、抽象データ、Pythonは次のキャッシュ計算に必要なすべての手配がガベージコレクションのpythonによるものである、準備に影響ローカライズされたガベージコレクションがプロセスに入ることになるときに、オブジェクトへの参照が、言語ですが、メモリは自動的にあり割り当てられたメモリの断片化につながるとCPUのキャッシュへの伝送に影響を与えることができ、必要なときに放出され、Pythonは高レベルの言語、いわゆる怒っているので、最後のものがあります。高レベルの言語では、開発者がプロトタイププログラムの実現を容易にすることができます、彼らはまた、疑問を提起適切コンパイラから最適化されていません。私たちは、静的なコードをコンパイルすると、コンパイラは最適化するために、オブジェクトのメモリレイアウトと最適化されたCPUの命令動作を変更するために多くのことを行うことができます。Pythonは動的型付けをサポートしていますので、ジョー・スミスは、最適化プロセスがさらに困難になり、目の点滅で始まりやゾウリムシであってもよいです。
後者の質問については、GIL自体に関するすべての話の最初の。既に前に述べたように、GILの中国名はグローバルインタプリタロックです。しかし、この欠点パイソンの言及があるが、パフォーマンスに影響を与えるが、これはPython言語の特性ではない明確にする必要がある、ということ、それは単にプロパティのPythonインタプリタ(CPythonと)の実現で導入されました。他のいくつかのPythonインタプリタは、JPythonのようなA問題、ではありません。今はCPythonしかし、それはによって支配されて誰ですか?
戻るGILは、公式の説明はこれです:

CPythonの、グローバルインタプリタロック、またはGILでは、一度にバイトコードのPythonの実行から複数​​のネイティブスレッドを防止ミューテックスです。CPythonののメモリ管理は、スレッドセーフではありませんので、このロックは主に必要です。(GILが存在するので、他の機能は、それが強制することを保証に依存して成長してきました。)

私たちは、最も自然なソリューションを持つ人々がロックになる前に、マルチスレッド同期の間でデータの整合性と状況を解決するために、見ることができます。しかし、多くのライブラリは、このような設定を受け入れていたので、後に開始する予定、それはこの機能の原因のような非常にのpythonではない「特性」。しかし、最適な設計のpython3で始まり、少なくとも、マルチスレッド化、高密度I / Oの問題は、まだ生き加速プログラムであるとき。

いくつかのパフォーマンステストツール

この本の第二章では、著者は、パフォーマンステストツールのいくつかの有用な比較紹介(python2ために、それらのいくつかはのpython3でご利用いただけます)。

  • Pythonのタイムモジュールを使用して、インポート時、これは、最も直感的かつ便利な方法は、そのような機能は以下のエレガントなコードセグメントに挿入されています
  • デコレータを定義し、実際に上記の時間モジュールを呼び出すが、デコレータは、パフォーマンス分析機能を実行する必要性に比較的エレガント完了できるだけ@;およびメソッド呼び出し機能を追加もたらしますので、オーバーヘッド、通常の状況下では、この方法は、この方法で測定された時間よりも小さいです
  • 直接使用することができ%ipythonインタプリタを使用する場合のpython -mはtimeit -n 5 -R 5で「インポートテストコード」、「機能コードは、特に、特定のパラメータを満たすために」、ワークロードはtimeitを低減するなど、はtimeitモジュールを使用して
  • 、リターン(これは内蔵のタイムシェルとは異なることに注意)システムの/ usr / binに/時間--verboseを使用して3回、本物の、ユーザー、およびSYS、シングルコアのマシンの面で本当の〜=ユーザー+ SYSが、タスクを複数のコアに割り当てられることになるので、これは一般的に真実ではありませんので、マルチコアマシンのために、完成されました
  • 内蔵のライブラリcProfileツールの標準を使用して、Pythonの-m cProfile -s累積ex.py
  • CPU集中プログラムはline_profiler使用することができますについて
  • heapy調査ヒープ
  • ダウザーインスタンス変数を描きます
  • DISバイトコードをチェック

上記は、基本的には、パフォーマンス分析ツールの異なるサイズをカバーし、すべての後のpython3を検証するために利用できるすべての私のツール、上記の、その徹底したpython2言う別れの後数ヶ月。
最初の4つのツールのみラフ、実行時の状況を提供することができ、私たちだけが、長い時間を実行するコードのどの部分を知っている、しかし、私たちは本当に理由を理解しないようにしましょう。微細に粗いから、DIS必要コードチェックバイトと本質的最適化プロセスを組み合わせると、後者は、コードcProfile正確な位置特定を呼び出す状況を理解し、その後プログレッシブツールline_profiler分析を使用する必要があります。しかし、我々はありませんを使用する必要があるので、真ん中には、私たちが使用するツールの多くはデコレータを必要としていることは注目に値するが、コードは、コードの正しさに影響を与えますテスト中デコレータは、実際には非常に迷惑な存在であります-op問題は時間のテストを防ぐためにデコレータです。
最後に、そうすることができた場合、それは比較的「クリーン」な計時システムのパフォーマンス分析と運用プロセスを行うのがベストです、ないように、分析の結果に影響します。

使用される基本的なデータ構造の計算

リストとタプル

連絡先リストやタプルの前に最初の文の説明、彼らはすべてのコンテナの配列を格納することができ、リストが動的配列で、タプルは、静的な配列です。リストの長さをリセットすることができますが、グループが素数でない、その内部の構成要素は、作成するために変更することはできませんすることができます。そして、我々はメモリを割り当てるためにカーネル毎回タプルにアクセスするために訪問する必要はありませんが、間違いなく効率が比較的高くないと言うことですPythonランタイム環境タプル、とキャッシュ。
メモリの割り当ては、実際には、Pythonはすべての時間は、新しいデータを作成し、新しいリストを作成するとき、リストは、リストの長さの増加の大きさにより変更することができ、リストの上に手の込んだ、しかし、この新しいリストのサイズ+1は、私たちは新たなスタートを追加するたびに同様の多くの時間は、論理的にローカル操作として理解することができるバックを添加することができるので、これは、前のリストの長さよりも大きいです。操作のコストが大きいので、それは、それはメモリコピーに関連するこのプロセスとして、ことは注目に値します。
タプルだから、どのようにそれがリストとは異なり、タプルの各追加要素が分布を持つと仕事をコピーしますので、タプルではなく、リストなどない「のオーバーブッキング現象は」唯一の現在のリストに使用することができないですそれは十分な長やることではないとき。Pythonのタプルを扱うときに加えて、静的プロパティを持つタプルので、そのリソースのキャッシュ、タプルはもはや使用されている、彼らのスペースは、将来の使用に、すぐにシステムに戻ったが、残されていない場合でも手段であり、 。これは、将来的には、同じサイズである必要性のオペレーティングシステムがメモリを申請する必要はありませんタプルが、この予約領域を直接使用する場合。
データの検索の問題の一覧については、内蔵されたソートのpython(ティム・アルゴリズム)+バイナリ検索を使用することをお勧めします。

辞書とコレクション

実際には、我々は、辞書やコレクションについて話している上記の一般リストの表れと考えることができます。私たちは、リストを使用するときは、実際には、参照、インデックス、またはキーoffser辞書メモリロケーションああです!実際には、辞書には、このアイデアを実現するために学ぶことです。我々はいくつかの注文データを有しているが、参照オブジェクトに対するインデックスのみとすることができるならば、一般に、(任意の型のオブジェクトになることができるハッシュインデックスとすることができる)、我々は辞書とコレクションを使用することができます。しかし、それはより一層特別の一部のコレクションで、我々はキーのセットを考慮することができるが、その値が含まれていません。
辞書のクエリの役割は比較的簡単ですが、データを挿入すると、ヘルプハッシュ関数にする必要があります。本質的には、新しいデータが属性データに応じて、2つの位置に挿入され、どのようにキーのハッシュ値と他のオブジェクトとの比較値。我々はデータを挿入すると、ハッシュ値が第1のマスキングキーを計算すると、有効な配列インデックスを取得する必要があるためです。マスクは、ハッシュ値は、任意の数とすることができるされていることを確認するために、最終的なインデックス間隔に変換することができます。対応するインデックスは、場所を見つけることが、位置に対応するインデックス値が空の場合、挿入中に、我々は、値を付けることができるが、指標の位置がすでに使用中である場合ならば、次いで、2例に分割インデックス位置の値私たちは、新たな位置を計算する機能を使用する必要がある新しい場所を見つけるために盗聴を実行するために、我々は、新しいインデックス位置を盗聴する必要が等しい値、直接リターン、または等しくない関係を挿入したいです。この関数は、実際に我々は彼が2つのプロパティを持つようにしたい、1が決定される特定のキー出力のためであるか、または私たちは大きな問題を持っているときに指定した検索操作で、他は分散した異なる機能のための入力キーの結果であり、 、エントロピー関数が十分な大きさであるべきです。テーブル自体が収まるようにサイズ変更されなければならないとき、より多くのコンテンツをハッシュテーブルに挿入されたときに漸進的に大きくなる時間辞書の性能への影響は、主な考慮事項は、辞書のサイズです。私たちは、より一般的なルールは、最適な省スペース化を持ちながら、より完全なテーブルの三分の二以下はまだ良いのハッシュ衝突回避率を持っているということではありません持っています。ハッシュテーブルがいっぱいになったときしかし、あなたは大きなテーブルを割り当てる必要があり、マスクは、新しいテーブルに再挿入され、その後、古いテーブルのすべての要素を新しいテーブルに合うように調整されます。このセンターは、インデックスを再計算する必要がありますので、必要性、パフォーマンスの警戒を最適化するとき。割り当てが不十分な長さハッシュ結果重複最小にするからです。

辞書と名前空間

Pythonの名前空間辞書とも素晴らしい関係を持って、実際のpythonでクエリへの辞書の過剰な使用と言うことができます。Pythonの変数、関数、時間モジュールにアクセスする場合、これらのオブジェクトを検索する方法を決定するメカニズムがあります。すべてのローカル変数のためのエントリ内に格納されているためで、pythonの最初の地元の人を探します()配列。実際のpythonここに大きな最適化のために、また、辞書引きの一部のみが、ここで必要とされていない上記のチェーンを検索します。地元の人々のpythonを()見つからない場合、それはグローバル()の辞書を検索します、そして最後に__buildin__オブジェクトを検索します。ネイティブコードを最適化しようとするときに外側の機能を保持するローカル変数を使用するオプションのプログラムです。もちろん、最高のディスプレイは、コードの可読性を高めるために与えられています。

イテレータとジェネレータ

まず、聞かせてのは、冷たい水のポットを注ぐ、発電機は、計算効率に事実Zuoshaの貢献ではないが、実際のメモリ消費量を減らすことができます。さらに、本は普通の関数が生成されたデータの操作を担当しながら、発電機は、データを作成するために使用される発電機まで正常な機能を説明することができる発電機の使用を記載しています。この機能および増加明瞭と論理機能コードの分割、及び切り離さ反射されます。また、本はまた、発電機によって引き起こされる問題、または「シングルパス」の問題を説明し、我々は現在の値をのみアクセスできますが、シリーズのできない他の要素にアクセス。しかし、すべての後に、発電機は、メモリを節約することができ、文句を言うことは何も、この上記で保存されていないが、これは避けられないトレードオフではありません。あなたは私たちが(などislice、など)は、この問題を解決することができますいくつかは機能のPythonの標準ライブラリitertoolsライブラリを呼び出すことができます。

行列とベクトルの計算

この章の内容は、存在してもよいパイソンベクトル計算のボトルネックを導入することで、原因と解決策を記載しています。プロセスは、注目に値するいくつかのポイントが存在する前記拡散方程式を、話し始めの例として使用されます。高密度コンピューティング環境のCPUである私たちは、変数やリストを格納するためのメモリを必要とするとき最初に、メモリ割り当てが安い、毎回は、Pythonはオペレーティングシステムにメモリを適用するための時間を取る必要がありますしない、そしてトラバースする必要があります新しいスペースは、そう、これは私たちにいくつかの速度の向上を与えるだろう、割り当てられたメモリ空間の使用(または再利用)を最大化する必要があり、変数の下の値に十分なケースを割り当てて、彼に初期化され割り当てられます。もう一つのポイントはまた、コアの問題を計算するPythonのベクターは、Pythonはベクトル演算をサポートしていない先に述べたように、そのメモリの断片です。これは主に二つの理由によって引き起こされる、Pythonの格納されたリストのポインタは、実際のデータを指している、実際のデータをメモリに順次格納されていないと、Pythonのバイトコード自体は、ベクトル演算用に最適化されていません。非常に大きい実際ベクトル演算の使用に影響を与える上述の理由で、簡単な第一の読み出し動作は、リスト内の最初のインデックスに応じて対応する位置を見つけるために、要素に分解されるが、位置は保存された対応しますアドレス値は、送信は、使い捨てにすることはできません、我々はデータのブロックに話すことを試みるときに、我々は送信のみの小片を分離することができた、それはさらにより大きな粒子サイズは、アドレスを間接参照に対応する値を取得する必要があるのでブロック全体が、我々はまた、状況はキャッシュ、悪いに表示されるかを予測することはできません!「フォン・ノイマンボトルネック」が登場しました。解決策を見つけようとする前に、実行中のCPUの処理プログラムは、プロテストは良いツールであるかを理解するためのツールPERFのLinuxを使用することができますが、それは、同じLinuxカーネルのバージョンのインストールを確認するのが最善です。分析の結果によって本は、それが達成されますときに我々はCPUのキャッシュに関連するデータを記入しますベクトル計算理解することは難しいことではありません。しかし、バス専用メモリデータの連続的な移動による、データはRAMが連続して格納されている場合にのみ可能です。、Pythonの連続データ内のオブジェクトの配列がメモリに保存されているが、我々は良いツールを必要とするので、Pythonバイトコードの問題は、リストよりも実際に遅いリストを作成するために、実際の配列型はもちろんのこと、未解決のままこれはnumpyのを紹介する時間です。
numpyのは、データが連続的にメモリに格納することができ、データは、ベクトル演算をサポートします。代わりに、実際のコード(特化した機能がより良好専用コード共通コード・パフォーマンス一般に、すべての後に、可能である)対応する機能numpyのを使用し、パフォーマンスの改善をもたらすことができます。そして、実際のコードは、我々はまた、メモリ割り当て、メモリの割り当てに起因する影響を避けるために、インプレース操作使用することができ、すべての後に、それはキャッシュの失敗よりも高価です。それはRAMと探しする必要があり、メモリ割り当てにキャッシュ内のデータを見つけることができないためだけでなく、オペレーティング・システムがそれを維持するよう要求データも利用可能でなければなりません。オペレーティングシステムを要求するために必要なオーバーヘッドは単純にキャッシュを埋めるよりもはるかに大きいです。キャッシュミスを充填した後、マザーボードの動作(タプルが同様のメカニズムは、リフィル高速になり、以前にも述べた)に最適化されたハードウェアですが、あなたは、他のプロセスとカーネルの契約をメモリを割り当てる必要があります。しかし、もっと痛い、我々は(特に連続ローカル操作)がnumexprツールを使用することにより、より直感的でより便利であるローカル操作を行うことができますが、それであるが、コードの可読性ローカル操作はまだ比較的貧弱です。
最後に、ベクトル演算時の研究は、ハードウェアのキャッシュ関連の知識の最良の事前の理解は、研究成果PERF、データの局所性を理解し、プログラムの最適化は非常に有用であることを言及する価値があります。

動的言語の問題を解決!コンパイルされたC

それは、最初に導入していないため、動的言語のコンパイラの最適化のため、コードの実際の実行効率を向上させることが困難です。この本は、マシンコードにコンパイルされたコードの私たちの一部の面でいくつかの方法を提供します。

  • CythonはC.の最も一般的なツールをコンパイル numpyのPythonのサポートと標準のデフォルトのgcc
  • C PythonはG ++を使用して変換器に非numpyのコードに自動的に変換するための皮膚を当てます
  • 新しいコンパイラnumpyのにNumbaコードの特定
  • 新しい非コードコンパイラnumpyのためPythran numpyの
  • PyPyは、従来のPython(主にはCPythonを参照に)インタイムコンパイラを置き換えることができ、コールドスタートでの相対的なJITとAOTの問題、JITと短く、頻繁に実行スクリプトに対処するためではないことに留意すべきです

私の訪問の後、より優れたユーザーエクスペリエンスでのpython3でご利用いただけますが、CythonとPyPyにする必要がありますが、貧しい人々のためのPyPy numpyのサポート、numpypyプロジェクトを行う前に、ベースCPythonのは、numpyのライブラリを変換するために使用さ80を作りました作業%のnumpyのプロジェクトを中止した後、スピニングクラスnumpyのの使用によって置き換え。しかし、効率さて、あなたは漢バイクああする必要があります!しかし残念ながら、しかし、効率性の観点、CythonのためのPyPyはまだJIT効率が3倍Cython一般的であり、他方は永久サポートPyPyのpython2であるようにあまり使用numpyの、このような外部ライブラリのために、という利点を持っている、または友人のpython2に滞在する必要がすべての純粋なPython環境の後に、それはほとんどの賞賛を得た、PyPyの下で考えることができます。密かにまだすべての後に、まだJITに自信を持って、我々は安全にpypyでnumpyのを使用することができると思います。しかし、JITのケースは、速度の向上は本当にそれcpyext存在を相殺することができますか?
実際には、この章では、それが本当にプライベートな科学技術のコンテンツの内容であると思いますが、ない幸せすぎてうまくやって始まり、レッツ・カウントが少しBだった、我々はそれを高めるためにどのようにコンパイラを起動するために使用しましたか?
まず、呼び出し元のコード外部ライブラリは、ハハ、コンパイルした後何も速くはありません、そして第二に、私たちはスピードを得ることができ、私のI上/ O集中型のコードを向上させることを期待することはできません。言い換えれば、コードは(すべての後、私たちはPythonのああを選択しました)もっと早く書かれた通常のCコードよりも地味後にコンパイルすることはできません。我々は最適化されたコードは、検量線を得るためにバインドされているときに、我々は最初のプログラムの動作を理解するためにコードを解析し、エビデンスに基づくアルゴリズムの変更およびコンパイラの性能向上の使用を始めた、そして最終的に我々は最終的にそのワークロードの増加を実現します小さなリターンをもたらすために、コマンドは、それを閉鎖するための時間です!

Cython

実際には、自分の仕事を理解することは非常に簡単で、Cythonをコンパイルすることにより、Cコードにファイルをする.pycますsetup.pyを実行することによって案内されて、我々は中間コードと静的ライブラリcを取得します。
GUIは、コードブロックを注釈を付け、その後、(いくつかの汎用性を失うことにバインド)注釈を追加し、リストを計算するために最適化されたプログラムをboundscheck削除することによってすることができます表示するには、ブラウザでCython自身の注釈オプションで使用した場合。準備がnogilで指定良いこと、であるOpenMPのもちろん、あなたが起動することができます。

シェッドスキン

気持ちはぬるいプロジェクトですが、またのpython3限ら支援のため、その平均のpythonコンパイラのために民間の思考の深い理解がしませんでした非常にソリューションをだますされ、のみで皮膚を流し、例を作るためにシードを与える必要がコンパイラは、開発者は、ユーザーがコードを変更できるようにするために、自動的にコンパイラを利用することができ、その後、「快適」が、この知識を習得するためにソフトウェアのユーザーに加速されることはありません。しかし、それはシェッドスキンを実行するために、別のメモリ空間であるため、追加のオーバーヘッドメモリコピーが存在するであろうことは注目に値します。

PyPy

pypyは加速的にコンパイル私のお気に入りのgetですが、それはnumpyのためのネイティブサポートではありませんが、cpyextて接続する(のり?)を行うために、底がCライブラリを使用してnumpyのために非常に友好的ではありませんので、しかしPyPyは非常にあるので、アクティブなプロジェクトは、PyPy6.0の到着で、実際には、あなたはすでに大幅に本当に強いJITはもちろんのこと、パフォーマンスnumpyの中で改善されて見ることができる、私はPyPyの開発について非常に楽観的。

によって複雑

主にプログラムのI / Oの実装の流れの影響に対処するために、私たちは一緒にこの時間を使用することができ、他の操作を、私は、実行時に/同時O操作が完了したため、私たちは待ってみましょうことができます。私たちの目標は、I / O待ちを解決することです。
前に完了するI / O動作するまでI / O待ちにプログラムは、カーネルI / Oは、(コンテキストスイッチを完了するために、である)、低レベルの操作に関連する要求実行できるように、停止され深いビュー、続けます。しかし、ヘビー級コンテキストスイッチは、あなたは多くの資源を消費する必要があります。具体的には、我々はプログラムのセーブ最初に必要なコンテキストスイッチの状態は、終了のCPU使用率(言い換えれば、私たちはどのCPUレベルでのキャッシュのタイプを失うことになります)。このように、我々は、プログラムを再初期化し、実行を継続する準備ができているまでの時間を取る必要があるときに再び実行を許可されています。
我々は、一般的にそれが何であるかのアイデアによって複雑に使用すること?一般的に、我々はプログラムを管理するために、「イベントループ」を必要とする、実行している必要があります何を、いつ実行します。本質的には、機能のリストは、イベントループだけで実行する必要があること(またはキュー?)。この関数は、リストの一番上に実装し、次のいずれかに回す、というように。しかし、そのような操作は、実際にあるすべての後に、またオーバーヘッド切り替える機能で、コストがかかります、カーネルが呼び出されたメモリ機能で設定した時間を取る必要があり、かつキャッシュ状態も予測不可能です。プログラムは、I / O待機時間をたくさん持っている。しかし、機能スイッチが大幅にI /それらを使用するO待ち時間、そのコストに比べて、全体的なパフォーマンスが大幅に改善されますでしょう。
コールバックまたは将来:そして、ループプログラムを言及した時間は、2つの方法で主にあります。
非同期に使用することができます主なライブラリは以下のものを持っています:

  • メインロジック機能は非同期モードを作るために、将来を返し従うgevent、コードのロジックのほとんどは、一貫性を維持します
  • 非同期動作を実装するためにコールバックを使用竜巻
  • AsynclO

マルチプロセス

GIL前に導入し、それがコードを最適化私たちにもたらす害。しかし、GILの役割は、我々はいくつかのpythonのプロセスはGIL(もちろん、私たちはメッセージ配信の問題を検討するために有効にする必要があります)によって影響されることはありません実行するのpythonのプロセスに対応するスペースです。
Pythonのマルチプロセッシングモジュールは、ああ、私たちは、プロセス上のキュー、および共有データでタスクを共有し、プロセスベースおよびスレッドベースの並列処理を使用させることができます。その主なターゲットは、CPU集約型の問題を解決するために、単一のマルチコアの問題、より広範なアプリケーション空間です。実際には、ここに示したマルチプロセッシングOpenMPのフレームワークを使用するCコードのコンパイルcythonの以前にも紹介し使用することは、我々が広く使用され、並列コンピューティングを行う必要があるようなのpythonのnumpyのようライブラリを選択し、より高いレベルに取り組んでいます。

multiproceingモジュールは、いくつかの一般的なタスクを実行できます。

  • プロセスと並行してCPU集約型のタスクへのオブジェクトのプール付き
  • パラレルI / O集約型のタスクのスレッドプール内のダミーモジュール
  • なお、ジョブキューで共有
  • データ型が平行ワーカー間で状態を共有し、バイト、ネイティブのデータ型、および辞書のリストで共有することができます

multiproceingモジュールの主なコンポーネントは次のとおりです。

  • 派生コピー処理、現在のプロセスは、新しいプロセス識別子を作成し、タスクは、オペレーティング・システム内の別々のサブプロセスを実行します。開発者は、起動して、クエリプロセスのステータスをし、それを実行する方法を与えることができます。このような問題は、コピー由来起因する(乱数を発生させるような操作を使用する場合にも、上記の特性に起因して、我々は注意する必要があり、乱数を生成することができる各プロセスは全く同じである:-)
  • プール、プール、パッケージ化プロセスとスレッド。ワーカー・スレッド・プール内の作業の一部を共有し、集計結果を返すことができます。
  • キュー
  • マネージャ、2つのプロセス間の単方向または双方向の通信チャンネル
  • ctypesのは、プロセスがforkさせた後、ネイティブのデータ型は、親と子の間で共有しました
  • 同期プリミティブ

この本は、2つの並列処理のより代表的な例だった説明しています。モンテカルロ法のパイ求めると素数を見つけます。前者の作業負荷がバランスされ、異なる計算間隔で後者が不均一です。最初の例では、分析の演習で見つけることができる、ハイパースレッディング・リソースの非常に小さな値であり、当然のことながら、最大の問題は、ハイパースレッディングCPythonのは、多くのRAMを使用しての使用であり、すべての後に、ハイパースレッディングので、すべての、優しいキャッシュされていませんチップ上のリソースに残りの利用は、CPUが増すので、通常の状況下で、我々は適切な通信圧力を考慮すると、むしろ最適なターゲット、より多くのケースよりも、付加価値ハイパーとして見ることができる、非常に低いです王。
主な例を見つけるための第二に、著者は、並列の厄介な問題を解決するためにいくつかの戦略をまとめたものです。

  • 別の作業単位に作業を分割します
  • 労働者が、このような不均一な問題空間の問題素数を見つけるためには、動作シーケンスのランダム化の方法を採用することができます
  • ワークキューがオーバーヘッドに配置されている、平均時間であっても、シリアルパラレル部分を使用しないように事前にスクリーニングを行うために、可能な限り最小化されるように
  • 正当な理由がない場合、それは正直チャンクデフォルトを使用するのが最適です

クラスターおよびワーク・キュー

我々は最初の価値がそれに費やされる時間と労力を決定しなければならないので、実際には、コンピュータの心に過ごすために、1つのニーズを一般的な問題を扱うために、はるかに少ない1つのクラスタ以上です。Pythonはより平行パイソン、IPython平行とNSQあるソリューションの3つのクラスタの成熟有します。もちろん、基本的にこの順序でこれら三つのエントリのしやすさ。

  • インターフェースは使いやすいですパラレルパイソン、軽微な変更をマルチプロセッシングインタフェースができますが、機能は非常に強力ではありません
  • Ipythonクラスタは、MPIをサポートする予定で、より便利なデバッグ(すべての後に、対話形式で実行する方法です)
  • NSQ適切な高を達成するために、堅牢で強力なだけでなく、困難な高性能分散型メッセージングプラットフォーム

エンディング

実際には、一般的には、この本の内容は非常に豊富で、基本的に我々はより高速な方法のpythonプログラムの実行を使用していた(おそらく?Linuxの最適化をオーバークロック、ハードウェア構成を欠いている?)提示されています。そして、読者に大きなリマインダは、問題を解決するには、コンピューティング、高性能は、実際の経験だけで本の内容を見て、非常に重要である不浸透性食べることです。また、そのプログラム以降のオペレーティングシステムとコンピュータを調整する目的を達成するために、2つのサブクリティカルな知識で構成されなければならないので、まだ関連資料を見てする必要があります時間があると、システム周りの開いていません。
最後に、感謝nathanmarzのブログ:あなたによっては、あなたがNOの読者が持っている場合でも、ブログなら、私はブログを再書き込みする力を持ってみましょう。

おすすめ

転載: www.cnblogs.com/gabriel-sun/p/12128378.html