분명히 전체적으로 분류list(a)
하지 않고 [x for x in a]
어떤 시점에서 전체적으로[*a]
할당하고 항상 전체적으로 할당 합니까?
다음은 크기가 n에서 0부터 12까지이며 세 가지 방법에 대한 결과 크기는 바이트입니다.
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에서 재현 할 파이썬 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
합니까? 소스 코드는 어디에 있습니까?
( 이미지를 생성 한 데이터 및 코드와 Colab )
더 작은 n으로 확대 :
더 큰 n으로 축소 :
list(a)
전적으로 C에서 작동합니다. 반복 될 때 노드별로 내부 버퍼 노드를 할당 할 수 있습니다 a
. [x for x in a]
그냥 LIST_APPEND
많이 사용 하므로 일반 목록의 일반적인 "약간의 할당을 약간 할당하고 재 할당"패턴을 따릅니다. [*a]
을 사용합니다 BUILD_LIST_UNPACK
... 나는 분명히 초과 할당하는 것 외에는 그것이 무엇인지 알지 못합니다 :)
list(a)
와 [*a]
동일하며, 모두 overallocate이에 비해 [x for x in a]
, 그래서 ... sys.getsizeof
여기에 사용할 수있는 권리 도구가 될하지 않을 수 있습니다.
sys.getsizeof
올바른 도구 라고 생각 합니다. 그것은 전체적으로 list(a)
사용되는 것을 보여줍니다 . 실제로 새로운 기능 파이썬 3.8 에서는 "목록 생성자가 전체적으로 [...]"라고 언급 하지 않습니다 .
[*a]
것처럼 작동하지만extend
빈 목록에서 사용 하는 것처럼 보입니다 .