cPythonにはGILがあるので、マルチプロセッシングモジュールを使用せずに複数のコアでスクリプトを実行することはできません。しかし、複数のコアを使用してソートするなどの組み込み機能を停止するには何かがありますか?私はcPythonの構造を理解していませんが、私は 'GILの下のソートやリスト内包のような組み込み関数なのでしょうか?cPythonはsort、any、allなどの組み込み関数に複数のコアを使用しますか?
答えて
cPython GILは、単一のスレッドがプロセス内でバイトコードを実行できるようにするだけで、抽象化されていないCPUには関係しません。
今のところ、複数のプロセスをフォーク/使用するか、OS /ハードウェアがコールを受け取り、これを実行している(ほとんどありそうもない)場合を除き、すべての操作がシングルCPUコア。
Cで実装された組み込み関数は、基底のAPIへのより直接的な呼び出しであるため、「GILの下で」実行されますが、それらの関数に引数とデータを渡すことは、バイトコードを使用する読み書き。
ホストとのcPythonの関係をよりよく理解したい場合は、次のようなhigh-level official overviewおよび/またはthe PDF slides and the playground that I wrote for a conferenceをお勧めします。
自動的に並列化する機能はありません。一般に、スレッドを暗黙的に生成することは、ほとんどの言語では貧弱な形であると考えられています(これは変化していますが、純粋な関数型言語でしか見られません。警告を出さずにたくさんのスレッドを産み出すのは、ユーザーが自分のスレッドを起動しようとしたときに不思議なエラーが発生し、スレッドが多すぎるために一時的なエラーが発生する場合です。たとえGILが問題ではなかったとしても、これを行うことは意味がありません。つまり、GILはインタプリタ内部を保護するためのものであり、参照カウントが操作されている状況であれば常にカバーしています。まれに例外がありますが、PyObject*
(これはすべてのPythonレベルの型がCのように表されています)で意味のある作業を行うことはできません。通常、Pythonの組み込み関数は、ブロック操作(I/O、ロック待ちなど)に対してのみGILを解放します。これらのケースでは、PyObject
を完全にCレベルのタイプに変換し、参照カウントや他の内部が触れられていないのでGILを解放するため、GILリリースが正常な第三者のC拡張(および)高価な作業、GILの再取得、そして結果をCレベルのタイプからPythonレベルのオブジェクトに変換します。
- 1. FreeMarkerで複数の組み込み関数を使用する
- 2. 組み込み関数はジェネリックを使用しますか?
- 3. 組み込み関数/組み込み関数のテスト
- 4. python:別の方法で組み込み関数 "any"
- 5. 組み込み用のC/C++組み込み関数VMOVD
- 6. カスタムGoogle App関数での組み込み関数の使用
- 7. Python:組み込み関数を使用しないバイナリ・カウント
- 8. Pythonで組み込み関数popを使用するには?
- 9. 組み込み関数を使用したSSE2アセンブリのオーバーフロー
- 10. 組み込み関数IIF
- 11. Rustに組み込みのID関数はありますか?
- 12. .netの組み込み関数がparamsキーワードを使用していますか?
- 13. NHIbernateの式で組み込みSQL関数を使用する
- 14. GCCの組み込み関数を腕で使用する
- 15. 組み込み関数を使用してDataGridViewを印刷しますか? c#
- 16. 組み込み関数はmapDispatchToPropsのownPropsから来ました
- 17. 組み込みMatLab関数を使用しないガウスフィルタの適用
- 18. このR関数を組み込み関数で再表現しますか?
- 19. 関数呼び出しのオーバーヘッド - Pythonの組み込み関数が組み込み関数より速いのはなぜですか?
- 20. sysモジュールはCpythonインタープリタに組み込まれていますか?
- 21. OMNeT ++での64ビットコンパイラ組み込み関数の使用
- 22. 組み込みのPHP関数の使用
- 23. 組み込み関数の使用のn summarize_if
- 24. Cでチャネージケースの組み込み関数はありますか?
- 25. 組み込みデータベースと複数のカタログ
- 26. 組み込み関数を使わないリンクリストの作成
- 27. 組み込み関数の変更
- 28. CythonのAES-NI組み込み関数?
- 29. Netbeans組み込みPHP関数のコードハイライト
- 30. システム組み込み関数のエラー
GILはバイトコードだけではありません。参照カウントはGILの下でのみ更新する必要があります。つまり、参照カウントを操作するものはGILを解放することができません。 'any'、' all'、 'sorted'は、バイトコードが必ずしも実行されていない場合であっても、参照カウントの操作が多く発生しているため、GILの下で完全に実行されます(例えば、' sorted'の場合比較もC層にある組み込み型)。リファレンスカウントを維持するために原子操作を使用するテストが行われており、CPythonは常に許容できないほど遅くなっています。 – ShadowRanger
私はGIL _only_がバイトコードと関係しているとはっきりしていません - 私は質問の焦点をPythonの "フロントエンド"のsort/any/listに焦点を当てていました。それらに引数を渡すことはバイトコードで起こります。 –
あなたはしませんでしたが、主な問題は 'sorted' /' any'/'all'をGILから解放することを妨げています(たとえ処理される項目が比較のためにバイトコードを実行しないことを保証できても、 、述語の適用など)。 OPの質問は、バイトコードとは何かではなく、パラレル化とGIL制限に関する能力に関するものでした。組み込み関数はバイトコード層の下にありますが、GILから解放されているわけではありません。なぜなら、バイトコードを実行しないことが保証されていても(それはできません)、PythonオブジェクトGILが必要です。 – ShadowRanger