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

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

4
Pythonの配列が遅いのはなぜですか?
array.array配列はボックス化されていないように見えるので、リストよりも高速になると予想していました。 ただし、次の結果が得られます。 In [1]: import array In [2]: L = list(range(100000000)) In [3]: A = array.array('l', range(100000000)) In [4]: %timeit sum(L) 1 loop, best of 3: 667 ms per loop In [5]: %timeit sum(A) 1 loop, best of 3: 1.41 s per loop In [6]: %timeit sum(L) 1 loop, best …

4
Pythonの印刷機能を「ハッキング」することは可能ですか?
注:この質問は情報提供のみを目的としています。これでPythonの内部にどれだけ深く入ることができるのか興味があります。 少し前に、printステートメントに渡された文字列がへの呼び出しが行われた後/中に変更できるかどうかに関する特定の質問の中で議論が始まりましprintた。たとえば、次の関数について考えます。 def print_something(): print('This cat was scared.') これで、printが実行されると、ターミナルへの出力が表示されます。 This dog was scared. 「猫」という単語が「犬」という単語に置き換えられていることに注意してください。どこかで、何とかしてそれらの内部バッファーを変更して、出力内容を変更することができました。これは、元のコード作成者の明示的な許可なしに行われると想定します(したがって、ハッキング/ハイジャック)。 このコメント賢明@abarnertからは、具体的には、私が考えていました: これを行うにはいくつかの方法がありますが、それらはすべて非常に醜く、決して行うべきではありません。最も醜い方法は、おそらくcode関数内のオブジェクトを別のco_consts リストを持つオブジェクトに置き換えること です。次はおそらく、C APIにアクセスしてstrの内部バッファにアクセスすることです。[...] したがって、これは実際に可能であるように見えます。 この問題に取り組むための私の素朴な方法は次のとおりです。 >>> import inspect >>> exec(inspect.getsource(print_something).replace('cat', 'dog')) >>> print_something() This dog was scared. もちろん、それexecは悪いことですが、それが実際に質問に答えることはありません。なぜなら、呼び出されたとき/後 printに呼び出されるときに実際には何も変更しないからです。 @abarnertが説明したように、それはどのように行われますか?

6
辞書とセットの順序が任意であるのはなぜですか?
辞書またはPythonで設定されたループのループが「任意」の順序でどのように実行されるのか理解できません。 つまり、それはプログラミング言語なので、言語のすべてが100%決定されている必要がありますよね?Pythonには、辞書やセットのどの部分を選択するか、1番目、2番目などを決定する何らかのアルゴリズムが必要です。 何が欠けていますか?


3
[* a]が割り当て超過になる原因は何ですか?
どうやらlist(a)、[x for x in a]オーバーローケートしない、ある時点でオーバーローケートする、常に[*a]オーバーローケートするのでしょうか。 以下は、0から12までのサイズnと、3つのメソッドの結果のバイト単位のサイズです。 0 56 56 56 1 64 88 88 2 72 88 96 3 80 88 104 4 88 88 112 5 96 120 120 6 104 120 128 7 112 120 136 8 120 120 152 9 128 184 184 10 136 184 192 …

3
小さなリストよりも小さな文字列を反復するのが遅いのはなぜですか?
私はtimeitで遊んでいて、小さな文字列に対して単純なリストの理解を行うと、小さな単一の文字列のリストに対して同じ操作を行うよりも時間がかかることに気づきました。説明はありますか?ほぼ1.35倍の時間です。 >>> from timeit import timeit >>> timeit("[x for x in 'abc']") 2.0691067844831528 >>> timeit("[x for x in ['a', 'b', 'c']]") 1.5286479570345861 これを引き起こしている下位レベルで何が起こっていますか?

1
Python 3.5ではPython 3.4と比較してstr.translateがはるかに高速なのはなぜですか?
text.translate()Python 3.4 を使用して、指定された文字列から不要な文字を削除しようとしました。 最小限のコードは次のとおりです。 import sys s = 'abcde12345@#@$#%$' mapper = dict.fromkeys(i for i in range(sys.maxunicode) if chr(i) in '@#$') print(s.translate(mapper)) 期待どおりに動作します。ただし、Python 3.4とPython 3.5で同じプログラムを実行すると、大きな違いが生じます。 タイミングを計算するコードは python3 -m timeit -s "import sys;s = 'abcde12345@#@$#%$'*1000 ; mapper = dict.fromkeys(i for i in range(sys.maxunicode) if chr(i) in '@#$'); " "s.translate(mapper)" Python 3.4プログラムは1.3msかかりますが、Python 3.5の同じプログラムは26.4μsしかかかりません。 …

2
Pythonは、戻り値としてのみ使用される変数を最適化しますか?
次の2つのコードスニペット間に最終的な違いはありますか?1つ目は、関数内の変数に値を割り当て、その変数を返します。2番目の関数は、値を直接返すだけです。 Pythonはそれらを同等のバイトコードに変換しますか?それらの1つはより高速ですか? ケース1: def func(): a = 42 return a ケース2: def func(): return 42



4
Pythonのhash(n)== nはいつですか?
私はPythonのハッシュ関数で遊んでいます。小さな整数の場合、hash(n) == n常に表示されます。ただし、これは多数には適用されません。 >>> hash(2**100) == 2**100 False 私は驚きません、私はハッシュが有限の範囲の値を取ることを理解しています。その範囲は何ですか? バイナリ検索を使用して最小数を見つけてみましたhash(n) != n >>> import codejamhelpers # pip install codejamhelpers >>> help(codejamhelpers.binary_search) Help on function binary_search in module codejamhelpers.binary_search: binary_search(f, t) Given an increasing function :math:`f`, find the greatest non-negative integer :math:`n` such that :math:`f(n) \le t`. If :math:`f(n) > t` …

7
Pythonオブジェクトのコピー/ディープコピー操作をオーバーライドする方法は?
私は違いを理解copy対deepcopyコピーモジュール内を。私は以前は成功裏に使用copy.copyしcopy.deepcopyてきましたが、__copy__および__deepcopy__メソッドのオーバーロードについて実際に行ったのはこれが初めてです。私はすでにを通じて周りGoogleで検索して見てきたのインスタンスを探すためにPythonモジュールを内蔵__copy__し、__deepcopy__機能(例えばsets.py、decimal.py、およびfractions.py)が、私はまだ100%でないことを確認、私はそれを右に持っているんです。 これが私のシナリオです: 設定オブジェクトがあります。最初に、デフォルトの値のセットを使用して1つの構成オブジェクトをインスタンス化します。この構成は、他の複数のオブジェクトに渡されます(すべてのオブジェクトが同じ構成で開始されるようにするため)。ただし、ユーザーインタラクションが開始すると、各オブジェクトは、互いの構成に影響を与えずに、その構成を個別に微調整する必要があります(つまり、手渡しするために、初期構成のディープコピーを作成する必要があると言います)。 次にオブジェクトの例を示します。 class ChartConfig(object): def __init__(self): #Drawing properties (Booleans/strings) self.antialiased = None self.plot_style = None self.plot_title = None self.autoscale = None #X axis properties (strings/ints) self.xaxis_title = None self.xaxis_tick_rotation = None self.xaxis_tick_align = None #Y axis properties (strings/ints) self.yaxis_title = None self.yaxis_tick_rotation = None self.yaxis_tick_align = None #A …

1
tuple(set([1、“ a”、“ b”、“ c”、“ z”、“ f”]))== tuple(set([“ a”、“ b”、“ c”、 「z」、「f」、1]))ハッシュのランダム化が有効な場合、85%の時間ですか。
ゼロピレウスの別の質問への回答を考えると、 x = tuple(set([1, "a", "b", "c", "z", "f"])) y = tuple(set(["a", "b", "c", "z", "f", 1])) print(x == y) プリント Trueと時間の85%程度のハッシュのランダム化が有効になって。なぜ85%ですか?

3
maxがsortより遅いのはなぜですか?
Python 2および3の関数maxよりも遅いことがわかりましたsort。 Python 2 $ python -m timeit -s 'import random;a=range(10000);random.shuffle(a)' 'a.sort();a[-1]' 1000 loops, best of 3: 239 usec per loop $ python -m timeit -s 'import random;a=range(10000);random.shuffle(a)' 'max(a)' 1000 loops, best of 3: 342 usec per loop Python 3 $ python3 -m timeit -s 'import random;a=list(range(10000));random.shuffle(a)' 'a.sort();a[-1]' 1000 loops, …

2
.pycファイルはいつ更新されますか?
「.pyc」ファイルは、プログラムをより高速に実行するために実行時に作成される、平文の「.py」ファイルのコンパイル済みバージョンであることを理解しています。しかし、私はいくつかのことを観察しました: 「py」ファイルを変更すると、プログラムの動作が変わります。これは、「py」ファイルがコンパイルされるか、少なくとも何らかのハッシュプロセスを実行するか、タイムスタンプを比較して、再コンパイルする必要があるかどうかを判断することを示します。 すべての「.pyc」ファイル(rm *.pyc)を削除すると、プログラムの動作が変わる場合があります。これは、「。py」の更新時にコンパイルされていないことを示します。 質問: いつコンパイルするかをどのように決定しますか? 開発中にそれらがより厳密にチェックされることを保証する方法はありますか?

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