問題タブ [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のリストはどのように実装されていますか?
それはリンクリストですか、配列ですか?周りを検索したところ、推測している人しか見つかりませんでした。私のCの知識は、ソースコードを見るのに十分ではありません。
python - Pythonオブジェクトはどのような構造でメモリに保存されますか?
私がクラスAを持っているとしましょう:
そして、私はテイクsys.getsizeof
のインスタンスのバイト数を確認するために使用します。A
上記の実験で示したように、A
オブジェクトのサイズは何であっても同じself.x
です。
では、Pythonがオブジェクトを内部的にどのように保存するのだろうか?
python - 特定のPythonモジュールが組み込みモジュールであるかどうかの判断
さまざまなモジュールの解析とイントロスペクションを行っていますが、組み込みモジュールを解析したくありません。現在、のような組み込みモジュール用の特別なタイプはありませんがtypes.BuiltinFunctionType
、これを行うにはどうすればよいですか?
Pythonによると、モジュールに属性がない場合、モジュールは明らかに組み込まれてい__file__
ます。hasattr(SomeModule, '__file__')
これは、モジュールが組み込まれているかどうかを確認する方法であることを意味しますか?確かに、それはに正確に一般的ではありませんがdel SomeModule.__file__
、モジュールが組み込まれているかどうかを判断するためのより確実な方法はありますか?
python - Pythonの新しいオブジェクトごとにrefが2増えるのはなぜですか?
新しいオブジェクトが定義された後、インタラクティブ環境の参照数が2増加するのは、私には少し奇妙です。オブジェクトを1つだけ作成しましたね。
python - タプルよりも高速なリストルックアップ?
以前は、タイトなループで配列のようなインデックスルックアップが必要な場合、タプルは一般的に非常にパフォーマンスが高いように見えるため(n個の変数を使用するのに近い)、通常はタプルを使用します。しかし、私は今日その仮定に疑問を呈することに決め、いくつかの驚くべき結果を思いつきました。
タプルルックアップは、リストルックアップよりも17%長くかかるようです。繰り返し実験を行ったところ、同様の結果が得られました。それぞれを分解すると、両方とも次のようになりました。
参考までに、一般的な10,000,000個のグローバル変数のルックアップ/リターンには2.2秒かかります。また、念のため、ラムダなしで実行しました(10,000,000ではなくnumber = 100,000,000であることに注意してください)。
ここでは、タプルルックアップに35%長くかかります。何が起きてる?非常にタイトなループの場合、これは実際には重大な不一致のように見えます。これを引き起こしている可能性がありますか?
変数への分解(たとえば、x、y = t)の場合、タプルはわずかに高速であり(私のいくつかのテストでは、時間は約6%少なくなります)、固定数の引数から構築する場合、タプルはより速くなります(時間は約83%少なくなります)。 )。これらの結果を一般的なルールとして受け取らないでください。ほとんどのプロジェクトでは意味がないミニテストをいくつか実行しました。
python - デルはPythonでいつ役に立ちますか?
Pythonがキーワードを必要とする理由を私は本当に考えることができませんdel
(そしてほとんどの言語は同様のキーワードを持っていないようです)。たとえば、変数を削除するのではなく、単に割り当てることができNone
ます。また、辞書から削除するときに、del
メソッドを追加することができます。
Pythonを使い続ける理由はありますdel
か、それともPythonのガベージコレクション前の時代の痕跡ですか?
python - from-import を使用する場合、Python が循環インポートに対してより厳密なのはなぜですか?
Python は、循環インポートに陥る可能性のある状況を思いとどまらせることを知っています。しかし、循環インポートの状況で from-import が通常のインポートよりも恣意的に寛大でないように見える理由について、Python の内部構造を理解したいと思いました。
たとえば、次のコードはコンパイルされます。
ただし、このコードは次のことを行いません。
すべてのインポートが完了する前に関連するクラスを使用しようとしない限り、コンパイラ エラーは発生しません。しかし、エイリアシングを行おうとすると失敗します。from-import が使用されている場合にのみ、このエラーが頭をもたげる原因となる Python の内部で何が起こっているのかを誰かが説明できますか? 第二に、これを回避する簡単な方法はありますか? (明らかな「共有コードを 3 番目のモジュールに引き出す」以外に、私はおそらくそうするでしょう。)
python - Python:*と**が/とsqrt()よりも速いのはなぜですか?
コードを最適化しているときに、次のことに気づきました。
そしてまた:
PythonがCで実装される方法に関係していると思いますが、なぜそうなのかを誰かが説明したいと思うでしょうか?
python - リストやタプルを作成するよりも、フィルターからセットを作成する方がはるかに高速なのはなぜですか?
インターラブルで実行filter
していて、結果をシーケンスに格納したい(シーケンスを使用できるようにするためにシーケンスが必要ですrandom.choice
)。フィルタオブジェクトからセットを作成する方が、リストやタプルを作成するよりもはるかに高速であることに気付きました。何故ですか?最初に、フィルタータイプはセットのサブタイプであり、これを説明しますが、関数は実際にはジェネレーター式と同じであるため、実際には内部でセットにすることはできません。filter
速度を確認するために次のテストを実行しました。
そして、結果はセットを使用するために明確に話していました:
では、なぜフィルターからセットを作成する方がはるかに速いのでしょうか。通常、すべての要素をハッシュする必要があるシーケンスからセットを作成するのと同じくらい時間がかかるべきではありませんか?それとも、内部フィルター表現から何らかの形で後押しを得ているのでしょうか?
比較のために、range
式でテストを実行する場合、とのset
約2倍の時間がかかります(どちらも速度はほぼ同じです)。list
tuple
編集:
Svenの答えは完全に正しいですが、完全を期すために、実際のフィルターで実行される更新されたテストは次のとおりです。
結果は、実際には何がより理にかなってlist
おり、tuple
両方が最速であることを示していますが、セットは実際には遅くはないので、何を使用しても違いはありません。
python - さまざまなプロセスで使用するためにPythonオブジェクトをメモリに保存するにはどうすればよいですか?
状況は次のとおりです。メモリにロードする必要のある大規模なオブジェクトがあります。非常に大きいため、2回ロードすると、マシンで使用可能なメモリを超えてしまいます(いいえ、メモリをアップグレードできません)。また、それを細かく分割することもできません。簡単にするために、オブジェクトが600 MBで、RAMが1GBしかない場合を考えてみましょう。複数のプロセスで実行されているWebアプリからこのオブジェクトを使用する必要があり、それらの生成方法を制御しないため(サードパーティのロードバランサーが実行します)、オブジェクトの作成だけに頼ることはできません。いくつかのマスタースレッド/プロセスで、次に子を生成します。これにより、POSHのようなものを使用する可能性もなくなります。これは、POSHが独自のカスタムフォーク呼び出しに依存しているためです。また、SQLiteメモリデータベース、mmap、posix_ipcなどは使用できません。sysv_ipc、およびshmモジュールは、これらがメモリ内のファイルとして機能するためです。このデータは、私が使用するためのオブジェクトである必要があります。それらの1つを使用すると、ファイルとして読み取ってから、個々のプロセスとBAMでオブジェクトに変換する必要があります。セグメンテーション違反は、2番目のコピーをロードしようとしたため、マシンのメモリ制限を超えてしまいます。
Pythonオブジェクトをメモリに(ファイル/文字列/シリアル化/ピクルスとしてではなく)格納し、どのプロセスからでもアクセスできるようにするための何らかの方法が必要です。私はそれが何であるかを知らないだけです。StackOverflowとGoogle全体を見てきましたが、答えが見つからないので、誰かが私を助けてくれることを願っています。