[解決済み] 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
11 144 184 200
12 152 184 208
このように計算されます。 repl.itで再現可能 Python 3を使用しています。 8 :
from sys import getsizeof
for n in range(13):
a = [None] * n
print(n, getsizeof(list(a)),
getsizeof([x for x in a]),
getsizeof([*a]))
では これはどのように機能するのでしょうか?
どのように
[*a]
オーバーロケート?実際、与えられた入力から結果リストを作成するのに、どのようなメカニズムを使っているのでしょうか?に対するイテレータを使用しているのでしょうか?
a
のようなものを使用し
list.append
? ソースコードはどこですか?
( データとコードで構成されるラボ 画像を生成したもの)
ズームインして小さくしたn。
ズームアウトして拡大したn。
解決方法は?
[*a]
は、内部的にはC言語と同等の
:
-
新しい、空の
list
-
電話
newlist.extend(a)
-
リターン
list
.
ということで、テストを展開すると。
from sys import getsizeof
for n in range(13):
a = [None] * n
l = []
l.extend(a)
print(n, getsizeof(list(a)),
getsizeof([x for x in a]),
getsizeof([*a]),
getsizeof(l))
の結果が表示されます。
getsizeof([*a])
と
l = []; l.extend(a); getsizeof(l)
は同じです。
これは通常正しいことです。
extend
一般化されたアンパッキングでも同様に、複数のものが次々と追加されることが想定されています。
[*a]
は通常の場合ではありません。Pythonは、複数のアイテムや反復記号が
list
(
[*a, b, c, *d]
)であるため、オーバーロケーションは一般的なケースで作業を軽減することができます。
これに対して
list
は、1つの大きさの反復記号から構成されます (
list()
は、使用中に大きくなったり小さくなったりすることはなく、そうでないことが証明されるまでは、オーバーロケートは時期尚早です。
Python は最近、サイズがわかっている入力に対してもコンストラクタをオーバーオールするバグを修正しました。
.
については
list
内包は、事実上繰り返される
append
のように、一度に1つの要素を追加する場合、通常のオーバーオールロケーションの成長パターンの最終結果を見ることができます。
はっきり言って、これはどれも言語保証ではありません。CPythonがどのように実装しているかを示しているに過ぎません。Python の言語仕様では、一般的に
list
(償却された
O(1)
append
と
pop
を末尾から削除)。コメントで指摘されているように、具体的な実装は3.9で再び変更されます。
[*a]
のようなケースに影響を与える可能性があります。
tuple
個々のアイテムの
extend
と共に
tuple
が複数回適用されるようになりました。
LIST_APPEND
そのため、オーバーロケーションが発生するタイミングや、計算に使用する数値が変わる可能性があります。
関連
-
[解決済み】 NameError: グローバル名 'xrange' は Python 3 で定義されていません。
-
[解決済み】Python elifの構文が無効です【終了しました
-
[解決済み】ValueError: pickleプロトコルがサポートされていません。3、python2 pickleはpython3 pickleでダンプしたファイルを読み込むことができない?
-
[解決済み] Pythonのリストメソッドであるappendとextendの違いは何ですか?
-
[解決済み] __init__.py は何のためにあるのですか?
-
[解決済み] パラメータに**(ダブルスター/アスタリスク)、*(スター/アスタリスク)がありますが、これはどういう意味ですか?
-
[解決済み] Python 3 の "python -m SimpleHTTPServer" に相当するものは何ですか?
-
[解決済み] setup.pyとは何ですか?
-
[解決済み】if __name__ == "__main__": は何をするのでしょうか?
-
[解決済み】__str__と__repr__の違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
python string splicing.join()とsplitting.split()の説明
-
パッケージングツールPyinstallerの使用と落とし穴の回避
-
Python入門 openを使ったファイルの読み書きの方法
-
任意波形を生成してtxtで保存するためのPython実装
-
FacebookオープンソースワンストップサービスpythonのタイミングツールKats詳細
-
[解決済み】RuntimeWarning: invalid value encountered in double_scalars で numpy の除算ができない。
-
[解決済み】TypeError: unhashable type: 'numpy.ndarray'.
-
[解決済み] データ型が理解できない
-
[解決済み】Pythonスクリプトで「Expected 2D array, got 1D array instead: 」というエラーが発生?
-
[解決済み】Python elifの構文が無効です【終了しました