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

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

4
シャッフルされたリストのコピーがはるかに遅いのはなぜですか?
シャッフルされたrange(10**6)リストを10回コピーすると、約0.18秒かかります(これらは5回の実行です)。 0.175597017661 0.173731403198 0.178601711594 0.180330912952 0.180811964451 シャッフルされていないリストを10回コピーすると、約0.05秒かかります。 0.058402235973 0.0505464636856 0.0509734306934 0.0526022752744 0.0513324916184 これが私のテストコードです: from timeit import timeit import random a = range(10**6) random.shuffle(a) # Remove this for the second test. a = list(a) # Just an attempt to "normalize" the list. for _ in range(5): print timeit(lambda: list(a), number=10) 私もでコピーしてみましたa[:]が、結果は似ていました(つまり、速度の差が大きい) …

1
インタプリタによって維持される整数キャッシュとは何ですか?
Pythonのソースコードを調べたところPyInt_Object、int(-5)からint(256)(@ src / Objects / intobject.c)までの範囲のsの配列が維持されていることがわかりました。 少しの実験でそれが証明されます: >>> a = 1 >>> b = 1 >>> a is b True >>> a = 257 >>> b = 257 >>> a is b False しかし、これらのコードをpyファイルで一緒に実行すると(またはセミコロンで結合すると)、結果は異なります。 >>> a = 257; b = 257; a is b True なぜそれらがまだ同じオブジェクトであるのか興味があるので、構文ツリーとコンパイラーを深く掘り下げて、以下にリストされている呼び出し階層を思いつきました。 PyRun_FileExFlags() mod = PyParser_ASTFromFile() …

1
Python:*と**が/とsqrt()よりも速いのはなぜですか?
コードを最適化しているときに、次のことに気づきました。 >>> from timeit import Timer as T >>> T(lambda : 1234567890 / 4.0).repeat() [0.22256922721862793, 0.20560789108276367, 0.20530295372009277] >>> from __future__ import division >>> T(lambda : 1234567890 / 4).repeat() [0.14969301223754883, 0.14155197143554688, 0.14141488075256348] >>> T(lambda : 1234567890 * 0.25).repeat() [0.13619112968444824, 0.1281130313873291, 0.12830305099487305] そしてまた: >>> from math import sqrt >>> T(lambda : sqrt(1234567890)).repeat() …

4
セットを繰り返し処理しながらセットに追加したり、セットから削除したりすると、なぜこれだけ多くの反復が行われるのですか?
Pythonのforループを理解しようとすると、{1}1回の反復で結果が得られるか、Cや他の言語のように反復を行うかによって、無限ループに陥るだろうと思いました。しかし、実際にはどちらもしませんでした。 >>> s = {0} >>> for i in s: ... s.add(i + 1) ... s.remove(i) ... >>> print(s) {16} なぜ16回反復するのですか?結果は{16}どこから来ますか? これはPython 3.8.2を使用していました。pypyでは期待どおりの結果になり{1}ます。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.