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. カスタムGoogle App関数での組み込み関数の使用
- 4. Python:組み込み関数を使用しないバイナリ・カウント
- 5. 組み込み関数を使用したSSE2アセンブリのオーバーフロー
- 6. GCCの組み込み関数を腕で使用する
- 7. NHIbernateの式で組み込みSQL関数を使用する
- 8. 組み込み関数を使用してDataGridViewを印刷しますか? c#
- 9. このR関数を組み込み関数で再表現しますか?
- 10. python組み込み関数の原理?
- 11. 組み込み関数の再定義
- 12. 組み込み関数の変更
- 13. 組み込み関数のPHPソースコード
- 14. Netbeans組み込みPHP関数のコードハイライト
- 15. ClojureはPythonの "any"関数と "all"関数に相当しますか?
- 16. gcc原子組み込み関数を使用するアトミックスワップ関数
- 17. 複数のhas_many_polymorphを1つのモデルに組み込みます
- 18. TBBとSSE2の組み込み関数を組み合せる
- 19. 関数名から組み込み関数を取得
- 20. 組み込みPHP関数のソースコードはどこにありますか?
- 21. AMD FMA 4組み込み関数のリファレンスはどこにありますか?
- 22. CoffeeScriptの組み込みヘルパー関数の使い方は?
- 23. 組み込み関数isequal、isnotequal、isgreaterなどのポイントは何ですか?
- 24. モンキーパッチはユニットテストのための組み込み関数ですか?
- 25. Clojure組み込み関数の関数定義:def vs defn
- 26. bash組み込み関数bashソースコード
- 27. SSE3組み込み関数:山車
- 28. コードビルドプロセスと組み込み関数
- 29. テーブルロードVBA vs組み込み関数
- 30. Objective Cに組み込み関数がありますか?
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