タグ付けされた質問 「python-internals」

Pythonは内部でどのように機能しますか?(たとえば)行われた設計の決定、および使用された内部データ構造とアルゴリズムに関する質問に使用します。

10
Python 3で「1000000000000000 in range(1000000000000001)」が非常に高速なのはなぜですか?
私が理解しているのは、range()実際にはPython 3のオブジェクト型である関数が、ジェネレーターのようにその場でコンテンツを生成することです。 これが事実である場合、1兆が範囲内にあるかどうかを判断するためには、1兆の値を生成する必要があるため、次の行に膨大な時間がかかると予想していました。 1000000000000000 in range(1000000000000001) さらに、ゼロをいくつ追加しても、計算には多少同じ時間がかかります(基本的には瞬時)。 私もこのようなことを試しましたが、計算はまだほとんど瞬時です: 1000000000000000000000 in range(0,1000000000000000000001,10) # count by tens 私が自分の範囲関数を実装しようとすると、結果はそれほど良くありません!! def my_crappy_range(N): i = 0 while i < N: yield i i += 1 return 何でrange()それがとても速くなりボンネットの下にやったオブジェクトは? マルタインピータースの答えは、その完全性のために選ばれた、だけでなく、見たabarnertの最初の答えのためにそれが何を意味するかの良い議論のためのrange本格的なようにシーケンスのPython 3での、およびのための潜在的な矛盾に関するいくつかの情報/警告__contains__のPython実装間の機能の最適化。abarnertの他の回答は、さらに詳細に説明されており、Python 3での最適化の背後にある歴史(およびxrangePython 2 での最適化の欠如)に関心のある人にリンクを提供しています。pokeとwim による回答は、関連するCソースコードと、興味がある人のための説明を提供します。

14
@propertyデコレーターはどのように機能しますか?
組み込み関数がどのように機能するかを理解したいと思いpropertyます。私を混乱させるのは、それpropertyがデコレーターとしても使用できることですが、組み込み関数として使用される場合にのみ引数を取り、デコレーターとして使用される場合は取りません。 この例はドキュメントからのものです: class C(object): def __init__(self): self._x = None def getx(self): return self._x def setx(self, value): self._x = value def delx(self): del self._x x = property(getx, setx, delx, "I'm the 'x' property.") property引数はgetx、setx、delxおよびドキュメンテーション文字列。 以下のコードでpropertyは、デコレータとして使用されています。そのオブジェクトはx関数ですが、上のコードでは、引数にオブジェクト関数の場所がありません。 class C(object): def __init__(self): self._x = None @property def x(self): """I'm the 'x' property.""" return self._x …


11
「is」演算子が整数で予期せず動作する
OverаэтотвопросестьответынаStack Overflowнарусском:Присваиваниецелых(int)вПитоне Pythonで以下が予期しない動作をするのはなぜですか? >>> a = 256 >>> b = 256 >>> a is b True # This is an expected result >>> a = 257 >>> b = 257 >>> a is b False # What happened here? Why is this False? >>> 257 is 257 True # Yet …

4
辞書はPython 3.6以降で注文されますか?
辞書は、以前のインカネーションとは異なり、Python 3.6(少なくともCPython実装の下)で注文されます。これは大幅な変更のようですが、ドキュメントの短い段落にすぎません。これは、言語機能ではなくCPython実装の詳細として記述されていますが、将来的には標準になる可能性があることも意味しています。 要素の順序を維持しながら、新しい辞書の実装は以前の辞書の実装よりもどのように優れていますか? ドキュメントからのテキストは次のとおりです。 dict()PyPyが開発した「コンパクト」表現を使用するようになりました。新しいdict()のメモリ使用量は、Python 3.5と比較して20%から25%小さくなっています。これにより、PEP 468(関数内の** kwargsの順序を維持する)が実装されます。この新しい実装の順序を維持する側面は、実装の詳細と見なされ、信頼すべきではありません(これは将来変更される可能性がありますが、言語仕様を変更する前に、この新しいdict実装をいくつかのリリースで使用することが望ましいです)現在および将来のすべてのPython実装に順序を維持するセマンティクスを義務付けるために、これは、ランダムな反復順序がまだ有効である古いバージョンの言語(Python 3.5など)との下位互換性を維持するのにも役立ちます。(稲田直樹による寄稿問題27350。レイモンドヘッティンガーが最初に提案したアイデア。) 2017年12月の更新:Python 3.7では、dict挿入順序の保持が保証されています

20
delはいつPythonで役に立ちますか?
pythonがdelキーワードを必要とする理由を本当に考えることはできません(ほとんどの言語には同様のキーワードがないようです)。たとえば、変数を削除するのではなく、単に変数に割り当てることができNoneます。また、辞書から削除する場合、delメソッドを追加することができます。 delPythonで維持する理由はありますか、それともPythonのガベージコレクション前の痕跡ですか?


2
一部のfloat <integer比較が他のものより4倍遅いのはなぜですか?
浮動小数点数を整数と比較する場合、値のペアによっては、同様の大きさの他の値よりも評価に時間がかかります。 例えば: &gt;&gt;&gt; import timeit &gt;&gt;&gt; timeit.timeit("562949953420000.7 &lt; 562949953421000") # run 1 million times 0.5387085462592742 しかし、浮動小数点数または整数を一定量だけ小さくまたは大きくすると、比較ははるかに速く実行されます。 &gt;&gt;&gt; timeit.timeit("562949953420000.7 &lt; 562949953422000") # integer increased by 1000 0.1481498428446173 &gt;&gt;&gt; timeit.timeit("562949953423001.8 &lt; 562949953421000") # float increased by 3001.1 0.1459577925548956 比較演算子を変更しても(例:==または&gt;代わりに)、時間に顕著な影響を与えることはありません。 大きい値または小さい値を選択すると比較が高速になるため、これはマグニチュードだけに関連しているわけではないので、ビットの並び方が不運なことにあるのではないかと思います。 明らかに、これらの値を比較することは、ほとんどのユースケースで十分な速さです。なぜPythonが他の値のペアよりもいくつかの値のペアで苦労しているように見えるのか、私は単に興味があります。

2
なぜ 'x'は( 'x'、)で 'x' == 'x'より速いのですか?
&gt;&gt;&gt; timeit.timeit("'x' in ('x',)") 0.04869917374131205 &gt;&gt;&gt; timeit.timeit("'x' == 'x'") 0.06144205736110564 また、複数の要素を持つタプルにも機能します。どちらのバージョンも直線的に増加するようです。 &gt;&gt;&gt; timeit.timeit("'x' in ('x', 'y')") 0.04866674801541748 &gt;&gt;&gt; timeit.timeit("'x' == 'x' or 'x' == 'y'") 0.06565782838087131 &gt;&gt;&gt; timeit.timeit("'x' in ('y', 'x')") 0.08975995576448526 &gt;&gt;&gt; timeit.timeit("'x' == 'y' or 'x' == 'y'") 0.12992391047427532 これに基づいて、私はどこでも完全に使い始めるべきだと思います!in==

8
CPythonのグローバルインタープリターロック(GIL)とは何ですか?
グローバルインタープリターロックとは何ですか、なぜ問題なのですか? PythonからのGILの削除に関して多くのノイズが発生していますが、それがなぜそれほど重要なのかを理解したいと思います。私はコンパイラーやインタープリターを自分で書いたことがないので、詳細にこだわる必要はありません。理解してもらう必要があるでしょう。



5
クラス定義のリスト内包からクラス変数にアクセスする
クラス定義内のリスト内包から他のクラス変数にどのようにアクセスしますか?以下はPython 2では機能しますが、Python 3では失敗します。 class Foo: x = 5 y = [x for i in range(1)] Python 3.2はエラーを出します: NameError: global name 'x' is not defined 試しFoo.xてもうまくいきません。Python 3でこれを行う方法に関するアイデアはありますか? やや複雑な動機付けの例: from collections import namedtuple class StateDatabase: State = namedtuple('State', ['name', 'capital']) db = [State(*args) for args in [ ['Alabama', 'Montgomery'], ['Alaska', 'Juneau'], # …

3
Python 3でx ** 4.0がx ** 4より速いのはなぜですか?
なぜx**4.0より速いのですx**4か?CPython 3.5.2を使用しています。 $ python -m timeit "for x in range(100):" " x**4.0" 10000 loops, best of 3: 24.2 usec per loop $ python -m timeit "for x in range(100):" " x**4" 10000 loops, best of 3: 30.6 usec per loop 上げた力を変更してその動作を確認しようとしました。たとえば、xを10または16の累乗にすると、30から35にジャンプしますが、フロートとして10.0だけ上げると、動いています。約24.1〜4。 float変換と2のべき乗と関係があるのではないかと思いますが、実際にはわかりません。 どちらの場合も2の累乗の方が速いことに気づきました。これらの計算は、インタプリタ/コンピュータにとってよりネイティブ/簡単だからです。しかし、それでも、フロートではほとんど動きません。2.0 =&gt; 24.1~4 &amp; 128.0 =&gt; 24.1~4 だが …

3
2つの同じリストのメモリフットプリントが異なるのはなぜですか?
私は2つのリストl1とを作成しましたl2が、それぞれに異なる作成方法を使用しています。 import sys l1 = [None] * 10 l2 = [None for _ in range(10)] print('Size of l1 =', sys.getsizeof(l1)) print('Size of l2 =', sys.getsizeof(l2)) しかし、出力は私を驚かせました: Size of l1 = 144 Size of l2 = 192 リスト内包表記で作成されたリストはメモリ内でサイズが大きくなりますが、それ以外の2つのリストはPythonでは同じです。 何故ですか?これはCPythonの内部的なものですか、それとも他の説明ですか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.