問題タブ [python-internals]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - Python での remove メソッドの安全な使用法
リストから UserList クラスを継承し、次のメソッドを実装して、削除済みとマークされたエントリを削除しました
要素自体は、比較演算子をオーバーライドするメソッドを持つ複雑なエンティティです
質問
- 上記のコードはオブジェクトの削除に成功しますか?
- リストから要素を削除するためにPythonは内部的にどのように機能しますか?
- 同じリストを同時に反復して変更すると、問題が発生しませんか?
python - なぜ「float」関数は 1.0 を掛けるより遅いのですか?
これが問題ではないと主張される可能性があることは理解していますが、私は HPC 環境用のソフトウェアを作成しているため、この 3.5 倍の速度向上は実際に違いをもたらします。
以前dis
はコードを見ていましたfloat()
が、関数呼び出しが必要なため遅くなると思います (残念ながら、dis.dis(float)
実際に何をしているのかを確認できませんでした)。
2番目の質問は、いつ使用する必要があるかfloat(n)
、いつ使用する必要があるかということだと思いますn * 1.0
。
python - バイトコードにコンパイルするときに整数除算が最適化されないのはなぜですか?
まず、私が行った実験を示しましょう。
dis.dis
の出力でわかるように、2 つに続いて 2 項演算ではなく に1.5 * 2
コンパイル4 - 2
されます。LOAD_CONST
LOAD_CONST
しかし4 / 2
、のようなものに置き換えられませんLOAD_CONST 4 (2)
。
最適化で除算が省略されているのはなぜでしょうか。
私が使用している Python のバージョンは 2.7.5 です。
ところで、Python 3 では、このような関数はより適切に最適化されているようです。
python - Python 関数で 2 ^ 16 を超える定数を使用できるのはなぜですか?
peepholeのような内部モジュールでは、 の引数は.LOAD_CONST
に続く 2 バイトに格納されますopcode
。
たとえば、操作の引数を取得するために使用するマクロは次のように実装されます。
#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
の引数は、配列LOAD_CONST
へのインデックスです。consts
したがって、Python 関数では最大 2 ^ 16 個の定数しか使用できないのではないかと推測しました。
しかし、66666 (> 65536) の定数を使用する関数を試してみると、正常に動作します。
その理由は何ですか?
python - CPython ガベージ コレクションはいつ実行されますか?
私の理解が正しければ、CPython では、参照カウントがゼロになるとすぐにオブジェクトが削除されます。到達不能になる参照サイクルがある場合、そのロジックは機能しませんが、場合によってはインタープリターがそれらを見つけて削除しようとします (これは gc.collect() を呼び出して手動で行うことができます)。
私の質問は、これらのインタープリターによってトリガーされるサイクル コレクションのステップがいつ発生するかということです。どのようなイベントがそれらをトリガーしますか?
私は CPython のケースにもっと興味がありますが、これが PyPy または他の Python 実装でどのように異なるかを知りたいです。