Görünüşe göre list(a)
değil, overallocate does [x for x in a]
bazı noktalarda overallocates ve [*a]
overallocates her zaman ?
Burada, n'den 0'a kadar olan boyutlar ve üç yöntem için elde edilen boyutlar bayt cinsinden verilmiştir:
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
Böyle Bilgisayarlı, repl.it de reproducable Python 3. kullanarak, 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]))
Peki: Bu nasıl çalışıyor? [*a]
Aşırı nasıl konumlanır? Aslında, verilen girdiden sonuç listesi oluşturmak için hangi mekanizmayı kullanıyor? Üzerinde bir yineleyici a
ve benzeri bir şey kullanıyor list.append
mu? Kaynak kodu nerede?
( Görüntüleri üreten veri ve kodlarla birlikte çalışın .)
Daha küçük n'ye yakınlaştırma:
Daha büyük n'ye yakınlaştırma:
list(a)
tamamen C olarak çalışır; dahili tampon düğümü, yinelendiğinde düğüm tarafından tahsis edebilir a
. [x for x in a]
sadece LIST_APPEND
çok kullanır , bu yüzden normal bir listenin normal "biraz fazla konumlandırın, gerektiğinde yeniden tahsis et" şeklini izler. [*a]
kullanır BUILD_LIST_UNPACK
, hangi ... Görünüşe göre her zaman aşırı tahsis dışında ne olduğunu bilmiyorum :)
list(a)
ve [*a]
aynı görünüyor ve her ikisine kıyasla aşırı konumlandırılmış [x for x in a]
, bu yüzden ... sys.getsizeof
burada kullanmak için doğru araç olmayabilir.
sys.getsizeof
doğru araç, sadece list(a)
overallocate için kullanılan gösterir . Aslında Python 3.8'de Neler Yeni : "Liste yapıcısı fazla [[]] konumlandırmaz" .
[*a]
gibi görünmesine rağmenextend
, boş bir listede olduğu gibi görünüyor .