පැහැදිලිවම list(a)
, overallocate නැති [x for x in a]
සමහර ස්ථානවල overallocates, සහ [*a]
overallocates සියලු කාලය ?
මෙන්න 0 සිට 12 දක්වා ප්රමාණයේ n සහ එහි ප්රති ing ලයක් ලෙස ක්රම තුන සඳහා බයිට් වලින්:
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
මේ ආකාරයට ගණනය කර ඇති අතර , පයිතන් 3 භාවිතා කරමින් repl.it හි ප්රජනනය කළ හැකිය . 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]
සමස්තයක් ලෙස ස්ථානගත වන්නේ කෙසේද ? ඇත්ත වශයෙන්ම, දී ඇති ආදානයෙන් ප්රති result ල ලැයිස්තුව නිර්මාණය කිරීමට එය භාවිතා කරන යාන්ත්රණය කුමක්ද? එය නැවත ඉරේටරයක් a
භාවිතා කර එවැනි දෙයක් භාවිතා list.append
කරයිද? ප්රභව කේතය කොහිද?
( රූප නිපදවූ දත්ත සහ කේත සමඟ කොලබ් .)
කුඩා n වෙත විශාලනය කිරීම:
විශාල n වෙත විශාලනය කිරීම:
list(a)
සම්පූර්ණයෙන්ම C හි ක්රියාත්මක වේ; එය අභ්යන්තර බෆරයේ නෝඩය නෝඩ් මගින් වෙන් කළ හැකිය a
. [x for x in a]
හුදෙක් භාවිතා LIST_APPEND
එය සාමාන්ය ලැයිස්තුව රටාවක් "අවශ්ය වූ විට නැවත වෙන්, ටිකක් overallocate" සාමාන්යය පහත නිසා, ගොඩක්. [*a]
භාවිතා කරයි BUILD_LIST_UNPACK
, කුමන ... පෙනෙන හැටියට සෑම විටම අධික ලෙස වෙන් කිරීම හැර, එය කරන්නේ කුමක්දැයි මම නොදනිමි :)
list(a)
හා [*a]
සමාන වන අතර, දෙකම overallocate සාපේක්ෂව [x for x in a]
ඉතින් ..., sys.getsizeof
මෙතන භාවිතා කිරීමේ අයිතිය මෙවලමක් විය නොහැකි විය.
sys.getsizeof
නිවැරදි මෙවලම යැයි මම සිතමි , එය පෙන්නුම් කරන්නේ අධික ලෙස ස්ථානගත කිරීම සඳහා list(a)
භාවිතා කළ බවයි. පයිතන් 3.8 හි ඇත්ත වශයෙන්ම අළුත් දේ එය සඳහන් කරයි: "ලැයිස්තු සාදන්නා අධික ලෙස ස්ථානගත නොකරයි [...]" .
[*a]
කිරීම ලෙසextend
වන අතර හිස් ලැයිස්තුවක් භාවිතා කරන ලෙස පෙනේ .