
1 рдорд┐рд▓рд┐рдпрди рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдореЗрдВ рдХрд┐рддрдиреА рдореЗрдореЛрд░реА рд▓рдЧрддреА рд╣реИ?
рдореИрдВ рдЕрдХреНрд╕рд░ рдЗрд╕ рд╕реЛрдЪ рд╕реЗ рд╣реИрд░рд╛рди рдерд╛ рдХрд┐ рдкрд╛рдпрдерди рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕реНрдореГрддрд┐ рдХрд╛ рдХрд┐рддрдиреА рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 1 рдорд┐рд▓рд┐рдпрди рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рддрдиреА рдореЗрдореЛрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдФрд░ рдордирдорд╛рдиреА рд▓рдВрдмрд╛рдИ рдХреА рд╕рдорд╛рди рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде?
рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдкрд╛рдпрдерди рдореЗрдВ рд╕реА рдореЗрдВ рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓рд┐рдП рдмрд┐рдирд╛ рд╕реАрдзреЗ рдЗрдВрдЯрд░рдПрдХреНрдЯрд┐рд╡ рдХрдВрд╕реЛрд▓ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрд╡рд╕рд░ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐, рдирд┐рд╖реНрдард╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрднреА рднреА рд╡рд╣реАрдВ рджреЗрдЦрддреЗ рд╣реИрдВ)ред
рдЬрд┐рдЬреНрдЮрд╛рд╕рд╛ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдХреЗ, рд╣рдо рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЕрдВрджрд░ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрдореЛрд░реА рдХрд┐рд╕ рдкрд░ рдЦрд░реНрдЪ рдХреА рдЬрд╛рддреА рд╣реИред
рд╕рднреА рдЙрджрд╛рд╣рд░рдг CPython рд╕рдВрд╕реНрдХрд░рдг 2.7.4 рдореЗрдВ 32 рдмрд┐рдЯ рдорд╢реАрди рдкрд░ рдмрдирд╛рдП рдЧрдП рдереЗред рдЕрдВрдд рдореЗрдВ 64 рдмрд┐рдЯ рдорд╢реАрди рдкрд░ рдореЗрдореЛрд░реА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЗрдмрд▓ рд╣реИред
рдЖрд╡рд╢реНрдпрдХ рдЙрдкрдХрд░рдг
sys.getsizeof рдФрд░ __sizeof __ () рд╡рд┐рдзрд┐
рдкрд╣рд▓рд╛ рдЙрдкрдХрд░рдг рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП рд╡рд╣ sys рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╣реИред рд╣рдо рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдЙрджреНрдзреГрдд рдХрд░рддреЗ рд╣реИрдВ:
sys.getsizeof (рдСрдмреНрдЬреЗрдХреНрдЯ [, default_value])
рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЖрдХрд╛рд░ рджреЗрддрд╛ рд╣реИред
рдпрджрд┐ рдХреЛрдИ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, TypeError рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЧреЗрдЯреНрд╕рд┐рдлрд╝реЙрдлрд╝ () __sizeof__ рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рд╕рдВрдЧреНрд░рд╣реАрдд рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЖрдХрд╛рд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИред
рдЧреЗрдЯрд┐рдЬрд╝реЛрдлрд╝ рдХрд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо (), рдкрд╛рдпрдерди рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛, рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:
Py_TPFLAGS_HAVE_GC = 1 << 14
рдЬрд╣рд╛рдВ PyGC_Head рдПрдХ рдбрдмрд▓ рд▓рд┐рдВрдХреНрдб рд╕реВрдЪреА рдЖрдЗрдЯрдо рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рдкрддреНрд░ рд▓рд┐рдВрдХ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ, рдЗрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд░рдЪрдирд╛ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
typedef union _gc_head { struct { union _gc_head *gc_next; union _gc_head *gc_sourcev; Py_ssize_t gc_refs; } gc; long double dummy; } PyGC_Head;
PyGC_Head рдХрд╛ рдЖрдХрд╛рд░ 32 рдмрд┐рдЯ рдорд╢реАрди рдкрд░ 12 рдмрд╛рдЗрдЯ рдФрд░ 64 рдмрд┐рдЯ рдорд╢реАрди рдкрд░ 24 рдмрд╛рдЗрдЯ рд╣реЛрдЧрд╛ред
рдЪрд▓реЛ рдХрдВрд╕реЛрд▓ рдореЗрдВ getizeof () рджреЗрдЦреЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:
>>> import sys >>> GC_FLAG = 1 << 14 >>> sys.getsizeof(1) 12 >>> (1).__sizeof__() 12 >>> bool(type(1).__flags__ & GC_FLAG) False >>> sys.getsizeof(1.1) 16 >>> (1.1).__sizeof__() 16 >>> bool(type(1.1).__flags__ & GC_FLAG) False >>> sys.getsizeof('') 21 >>> ''.__sizeof__() 21 >>> bool(type('').__flags__ & GC_FLAG) False >>> sys.getsizeof('hello') 26 >>> sys.getsizeof(tuple()) 24 >>> tuple().__sizeof__() 12 >>> bool(type(tuple()).__flags__ & GC_FLAG) True >>> sys.getsizeof(tuple((1, 2, 3))) 36
рдЭрдВрдбреЗ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рдЬрд╛рджреВ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЙрджрд╛рд╣рд░рдг рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, int рдФрд░ float рдкрд░ рдХреНрд░рдорд╢рдГ 12 рдФрд░ 16 рдмрд╛рдЗрдЯреНрд╕ рд╣реИрдВред рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдг рдХреЗ рд▓рд┐рдП Str 21 рдмрд╛рдЗрдЯреНрд╕ рдФрд░ рджреВрд╕рд░рд╛ рдмрд╛рдЗрдЯ рд▓реЗрддрд╛ рд╣реИред рдПрдХ рдЦрд╛рд▓реА рдЯрдкрд▓ рдореЗрдВ 12 рдмрд╛рдЗрдЯреНрд╕ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд 4 рдмрд╛рдЗрдЯреНрд╕ рдкреНрд░рддрд┐ рддрддреНрд╡ред рд╕рд░рд▓ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП (рдЬрд┐рд╕рдореЗрдВ рдЕрдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдЯреНрд░реИрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), sys.getsizeof рдХрд╛ рдорд╛рди __sizeof __ () рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдореВрд▓реНрдп рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред
рдЖрдИрдбреА () рдФрд░ ctypes.string_at
рдЕрдм рдЖрдЗрдП рдЬрд╛рдиреЗрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрдореЛрд░реА рдХрд┐рд╕ рдкрд░ рдЦрд░реНрдЪ рдХреА рдЬрд╛рддреА рд╣реИред
рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рджреЛ рдЪреАрдЬреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╣рд╛рдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдореЗрдореЛрд░реА рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдзреЗ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдкрд╛рдпрдерди рдзреНрдпрд╛рди рд╕реЗ рд╣рдореЗрдВ рд╕реНрдореГрддрд┐ рддрдХ рд╕реАрдзреА рдкрд╣реБрдВрдЪ рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИ, рдРрд╕рд╛ рдХрд░рдирд╛ рдЕрднреА рднреА рд╕рдВрднрд╡ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ рдПрдХ рд╡рд┐рднрд╛рдЬрди рддреНрд░реБрдЯрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИред
рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЖрдИрдбреА () рдлрд╝рдВрдХреНрд╢рди рд╕реНрдореГрддрд┐ рдкрддрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╢реБрд░реБрдЖрдд рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддреА рд╣реИ (рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрд╡рдпрдВ рдПрдХ рд╕реА рд╕рдВрд░рдЪрдирд╛ рд╣реИ)
>>> obj = 1 >>> id(obj) 158020320
рдореЗрдореЛрд░реА рдкрддреЗ рдкрд░ рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ ctypes рдореЙрдбреНрдпреВрд▓ рд╕реЗ string_at рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрд╕рдХрд╛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡рд┐рд╡рд░рдг рдмрд╣реБрдд рд╡рд┐рд╕реНрддреГрдд рдирд╣реАрдВ рд╣реИ:
ctypes.string_at (рдкрддрд╛ [, рд▓рдВрдмрд╛рдИ])
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╕реНрдореГрддрд┐ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдкрддреЗ рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдпрджрд┐ "рд▓рдВрдмрд╛рдИ" рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╢реВрдиреНрдп-рдЯрд░реНрдорд┐рдиреЗрдЯреЗрдб рд╣реИ,
рдЕрдм рдЖрдЗрдП рдЙрд╕ рдкрддреЗ рдкрд░ рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдЬреЛ рдЖрдИрдбреА () рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓реМрдЯрд╛ рд╣реИ:
>>> import ctypes >>> obj = 1 >>> sys.getsizeof(obj) 12 >>> ctypes.string_at(id(obj), 12) 'u\x01\x00\x00 \xf2&\x08\x01\x00\x00\x003\x01\x00\x00 \xf2&\x08\x00\x00\x00\x001\x00\x00\x00'
рд╣реЗрдХреНрд╕ рдХреЛрдб рдХрд╛ рд▓реБрдХ рдмрд╣реБрдд рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рд╕рдЪреНрдЪрд╛рдИ рдХреЗ рдХрд░реАрдм рд╣реИрдВред
рдореЙрдбрд▓ рд╕рдВрд░рдЪрдирд╛
рдзрд╛рд░рдгрд╛ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдореВрд▓реНрдпреЛрдВ рдореЗрдВ рдирд┐рд╖реНрдХрд░реНрд╖ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдФрд░ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╕рдВрд░рдЪрдирд╛ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдЕрдирдкреИрдХ () рдлрд╝рдВрдХреНрд╢рди рд╣рдореЗрдВ рдпрд╣рд╛рдВ рдорджрдж рдХрд░реЗрдЧрд╛ред
struct
рдпрд╣ рдореЙрдбреНрдпреВрд▓ рдкрд╛рдпрдерди рдореВрд▓реНрдпреЛрдВ рдФрд░ рд╕реА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдмреАрдЪ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
struct.unpack (рдкреНрд░рд╛рд░реВрдк, рд╕реНрдЯреНрд░рд┐рдВрдЧ)
рджрд┐рдП рдЧрдП рд╕реНрд╡рд░реВрдкреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкрд╛рд░ рдХрд░рддрд╛ рд╣реИред рд╣рдореЗрд╢рд╛ рдПрдХ рдЯрдкрд▓ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рддрддреНрд╡ рд╣реЛред рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдареАрдХ рдЙрд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░рд╛рд░реВрдк рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рд╣реИред
рдбреЗрдЯрд╛ рдкреНрд░рд╛рд░реВрдк рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред
рдкреНрд░рддреАрдХ | C рдорд╛рди | рдЕрдЬрдЧрд░ рдХрд╛ рдореВрд▓реНрдп | рдПрдХ 32 рдмрд┐рдЯ рдорд╢реАрди рдкрд░ рд▓рдВрдмрд╛рдИ |
рдЧ | рдЪрд╛рд░ | рдПрдХрд▓ рдЪрд░рд┐рддреНрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ | 1 |
рдореИрдВ | рдкреВрд░реНрдгрд╛рдВрдХ | рдкреВрд░реНрдгрд╛рдВрдХ | 4 |
рдПрд▓ | рд▓рдВрдмреЗ рд╕рдордп рддрдХ | рдкреВрд░реНрдгрд╛рдВрдХ | 4 |
рдПрд▓ | рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд▓рдВрдмреЗ | рдкреВрд░реНрдгрд╛рдВрдХ | 4 |
рдШ | рджреЛрд╣рд░рд╛ | рдирд╛рд╡ | 8 |
рдЕрдм рд╣рдо рд╕рдм рдХреБрдЫ рдПрдХ рд╕рд╛рде рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред
рдЗрдВрдЯ
>>> obj = 1 >>> sys.getsizeof(obj), obj.__sizeof__() (12, 12) >>> struct.unpack('LLl', ctypes.string_at(id(obj), 12)) (373, 136770080, 1)
рдореВрд▓реНрдп рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИред
рдкрд╣рд▓рд╛ рдирдВрдмрд░ (373) рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред
>>> obj2 = obj >>> struct.unpack('LLl', ctypes.string_at(id(obj), 12)) (374, 136770080, 1)
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реБрдИ, рдЬрдм рд╣рдордиреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд▓рд┐рдВрдХ рдмрдирд╛рдпрд╛ред
рджреВрд╕рд░рд╛ рдирдВрдмрд░ (136770080) рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ (рдЖрдИрдбреА) рд╣реИ:
>>> type(obj) <type 'int'> >>> id(type(obj) ) 136770080
рддреАрд╕рд░рд╛ рдирдВрдмрд░ (1) рд╕реАрдзреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕рд╛рдордЧреНрд░реА рд╣реИред
>>> obj = 1234567 >>> struct.unpack('LLl', ctypes.string_at(id(obj), 12)) (1, 136770080, 1234567)
CPython рдХреЗ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рджреЗрдЦрдХрд░ рд╣рдорд╛рд░реЗ рдЕрдиреБрдорд╛рдиреЛрдВ рдХреА рдкреБрд╖реНрдЯрд┐ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред
typedef struct { PyObject_HEAD long ob_ival; } PyIntObject;
рдпрд╣рд╛рдБ PyObject_HEAD рд╕рднреА рдирд┐рд░реНрдорд┐рдд рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЖрдо рд╣реИ, рдФрд░ ob_ival рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд▓рдВрдмрд╛ рдореВрд▓реНрдп рд╣реИред PyObject_HEAD рдореИрдХреНрд░реЛ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдореВрд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ - рдЬреЛ рд╣рдордиреЗ рджреЗрдЦрд╛ рдерд╛, рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рдЙрдВрдЯрд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИред
рдлреНрд▓реЛрдЯ
рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рд╕рдВрдЦреНрдпрд╛ рдЗрдВрдЯ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рд╕реА рдореЗрдореЛрд░реА рдореЗрдВ рдЯрд╛рдЗрдк рдбрдмрд▓ рдХреЗ рдорд╛рди рд╕реЗ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
typedef struct { PyObject_HEAD double ob_fval; } PyFloatObject;
рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ:
>>> obj = 1.1 >>> sys.getsizeof(obj), obj.__sizeof__() (16, 16) >>> struct.unpack('LLd', ctypes.string_at(id(obj), 16) (1, 136763968, 1.1)
рд╕реНрдЯреНрд░рд┐рдВрдЧ (Str)
рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдПрдХ рдЕрд╢рдХреНрдд рдмрд╛рдЗрдЯ рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╡рд░реНрдгреЛрдВ рдХреЗ рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд▓рдВрдмрд╛рдИ, рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рд╕реЗ рд╣реИрд╢, рдФрд░ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдВрддрд░рд┐рдХ рдХреИрд╢ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ рдпрд╛ рдирд╣реАрдВ рдпрд╣ рдПрдХ рдЕрд▓рдЧ рд▓рд╛рдЗрди рдХреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред
typedef struct { PyObject_VAR_HEAD long ob_shash; # int ob_sstate; # ? char ob_sval[1]; # + } PyStringObject;
PyObject_VAR_HEAD рдореИрдХреНрд░реЛ рдореЗрдВ PyObject_HEAD рд╢рд╛рдорд┐рд▓ рд╣реИ рдФрд░ рд▓рдВрдмреЗ ob_ival рдорд╛рди рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЬреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд▓рдВрдмрд╛рдИ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред
>>> obj = 'hello world' >>> sys.getsizeof(obj), obj.__sizeof__() (32, 32) >>> struct.unpack('LLLli' + 'c' * (len(obj) + 1), ctypes.string_at(id(obj), 4*5 + len(obj) + 1)) (1, 136790112, 11, -1500746465, 0, 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '\x00')
рдЪреМрдерд╛ рдорд╛рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рд╣реИрд╢ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред
>>> hash(obj) -1500746465
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, sstate рдорд╛рди 0 рд╣реИ, рдЗрд╕рд▓рд┐рдП рд▓рд╛рдЗрди рдЕрднреА рдХреИрд╢ рдирд╣реАрдВ рдХреА рдЧрдИ рд╣реИред рдЖрдЗрдП рдЗрд╕реЗ рдХреИрд╢ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:
>>> intern(obj) 'hello world' >>> struct.unpack('LLLli' + 'c' * (len(obj) + 1), ctypes.string_at(id(obj), 4*5 + len(obj) + 1)) (2, 136790112, 11, -1500746465, 1, 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '\x00')
рдЯрдкрд▓ (рдЯрдкрд▓)
рдПрдХ рдЯрдкрд▓ рдмрд┐рдВрджреБ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рд╣реИред рдЪреВрдБрдХрд┐ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рд░рд┐рдВрдЧ рд░реЗрдлрд╝рд░реЗрдВрд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕реЗ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╛рд╣рдХ рджреНрд╡рд╛рд░рд╛ рдЯреНрд░реИрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рдпрд╣ рд╣рдореЗрдВ sys.getsizeof () рдХреЙрд▓ рджреНрд╡рд╛рд░рд╛ рдпрд╛рдж рджрд┐рд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)
рдЯрдкрд▓ рд╕рдВрд░рдЪрдирд╛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдХреЗрд╡рд▓ рд▓рдВрдмрд╛рдИ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдХреНрд╖реЗрддреНрд░ рдирд╣реАрдВ рд╣реИрдВред
typedef struct { PyObject_VAR_HEAD PyObject *ob_item[1]; } PyTupleObject;
>>> obj = (1,2,3) >>> sys.getsizeof(obj), obj.__sizeof__() (36, 24) >>> struct.unpack('LLL'+'L'*len(obj), ctypes.string_at(id(obj), 12+4*len(obj))) (1, 136532800, 3, 146763112, 146763100, 146763088) >>> for i in obj: print i, id(i) 1 146763112 2 146763100 3 146763088
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЙрджрд╛рд╣рд░рдг рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЯрдкрд▓ рдХреЗ рдЕрдВрддрд┐рдо рддреАрди рддрддреНрд╡ рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рдВрдХреЗрдд рд╣реИрдВред
рд╢реЗрд╖ рдореВрд▓ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ (рдпреВрдирд┐рдХреЛрдб, рд╕реВрдЪреА, рддрд╛рдирд╛рд╢рд╛рд╣реА, рд╕реЗрдЯ, рдлреНрд░реЛрдЬрд╝реЗрдирд╕реЗрдЯ) рдХреЛ рдПрдХ рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рдЦреЛрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдкрд░рд┐рдгрд╛рдо рдХреНрдпрд╛ рд╣реИ?
рдЯрд╛рдЗрдк | CPython рдореЗрдВ рдирд╛рдо | рдкреНрд░рд╛рд░реВрдк | рдиреЗрд╕реНрдЯреЗрдб рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░реВрдк | 32 рдмрд┐рдЯ рд▓рдВрдмрд╛рдИ | 64 рдмрд┐рдЯ рд▓рдВрдмрд╛рдИ | рдЬреАрд╕реА рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА * |
рдЗрдВрдЯ | PyIntObject | рдПрд▓ рдПрд▓ рдПрд▓ | | 12 | 24 | |
рдирд╛рд╡ | PyFloatObject | lld | | 16 | 24 | |
str | PyStringObject | LLLli + c * (рд▓рдВрдмрд╛рдИ + 1) | | 21 + рд▓рдВрдмрд╛рдИ | 37 + рд▓рдВрдмрд╛рдИ | |
рдпреВрдирд┐рдХреЛрдб | PyUnicodeObject | LLLLlL | рдПрд▓ * (рд▓рдВрдмрд╛рдИ + 1) | 28 + 4 * рд▓рдВрдмрд╛рдИ | релреи + рек * рд▓рдВрдмрд╛рдИ | |
рдЯрдкрд▓ | PyTupleObject | рдПрд▓рдПрд▓рдПрд▓ + рдПрд▓ * рд▓рдВрдмрд╛рдИ | | 12 + 4 * рд▓рдВрдмрд╛рдИ | 24 + 8 * рд▓рдВрдмрд╛рдИ | рд╡рд╣рд╛рдБ рд╣реИ |
рд╕реВрдЪреА | PyListObject | рдПрд▓ * рел | рдПрд▓ * рд▓рдВрдмрд╛рдИ | 20 + 4 * рд▓рдВрдмрд╛рдИ | 40 + 8 * рд▓рдВрдмрд╛рдИ | рд╡рд╣рд╛рдБ рд╣реИ |
рд╕реЗрдЯ рдХрд░реЗрдВ / frozenset | PySetObject | рдПрд▓ * 7 + (рдПрд▓рдПрд▓) * 8 + рдПрд▓рдПрд▓ | рдПрд▓рдПрд▓ * рд▓рдВрдмрд╛рдИ | (<= 5 рдЖрдЗрдЯрдо) 100 (> 5 рдЖрдЗрдЯрдо) 100 + 8 * рд▓рдВрдмрд╛рдИ | (<= 5 рдЖрдЗрдЯрдо) 200 (> 5 рдЖрдЗрдЯрдо) 200 + 16 * рд▓рдВрдмрд╛рдИ | рд╡рд╣рд╛рдБ рд╣реИ |
dict | PyDictObject | рдПрд▓ * 7 + (рдПрд▓рдПрд▓рдПрд▓) * 8 | рдПрд▓рдПрд▓рдПрд▓ * рд▓рдВрдмрд╛рдИ | (<= 5 рдЖрдЗрдЯрдо) 124 (> 5 рдЖрдЗрдЯрдо) 124 + 12 * рд▓рдВрдмрд╛рдИ | (<= 5 рдЖрдЗрдЯрдо) 248 (> 5 рдЖрдЗрдЯрдо) 248 + 24 * рд▓рдВрдмрд╛рдИ | рд╡рд╣рд╛рдБ рд╣реИ |
* 32 рдмрд┐рдЯ рдорд╢реАрди рдкрд░ 12 рдмрд╛рдЗрдЯ рдФрд░ 64 рдмрд┐рдЯ рдорд╢реАрди рдкрд░ 32 рдмрд╛рдЗрдЯ рдЬреЛрдбрд╝рддрд╛ рд╣реИ
рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдкрд╛рдпрдерди рдореЗрдВ рд╕рд░рд▓ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╕реА рдореЗрдВ рдЙрдирдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рджреЛ рд╕реЗ рддреАрди рдЧреБрдирд╛ рдмрдбрд╝реЗ рд╣реИрдВред рдпрд╣ рдЕрдВрддрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рдВрджрд░реНрдн рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ (рдПрдХ рдкреЙрдЗрдмреЛрдЬреЗрдХреНрдЯ-рдПрдЪрдПрдЪрдПрдбреА рдореИрдХреНрд░реЛ рдХреА рд╕рд╛рдордЧреНрд░реА) рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдХрд╛рд░рдг рд╣реИред рдпрд╣ рдЖрдВрддрд░рд┐рдХ рдХреИрд╢рд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдСрдлрд╕реЗрдЯ рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдпрд╣ рдХреЗрд╡рд▓ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рд╣реИ)ред
рддрд╛рд░ рдФрд░ рдЯреБрдкрд▓реНрд╕ рдХреЗ рд▓рд┐рдП, рдЕрдВрддрд░ рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ - рдХреБрдЫ рдирд┐рд░рдВрддрд░ рдореВрд▓реНрдп рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдФрд░ рд╕реВрдЪреА, рд╢рдмреНрджрдХреЛрд╢ рдФрд░ рд╕реЗрдЯ, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрд╡рд╢реНрдпрдХ рд╕реЗ 1/3 рдЕрдзрд┐рдХ рдХрдмреНрдЬрд╛ред рдпрд╣ рдирдП рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдХрд╛рд░рдг рд╣реИ, рдЬреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдордп рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдореГрддрд┐ рдХрд╛ рдмрд▓рд┐рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рддреЛ, рд╣рдо рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрддреЗ рд╣реИрдВ: 1 рдорд┐рд▓рд┐рдпрди рдкреВрд░реНрдгрд╛рдВрдХ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ 11.4 рдореЗрдЧрд╛рдмрд╛рдЗрдЯреНрд╕ (12 * 10 ^ 6 рдмрд╛рдЗрдЯреНрд╕) рдХреА рдЬрд░реВрд░рдд рд╣реИ, рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рдФрд░ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд 3.8 рдореЗрдЧрд╛рдмрд╛рдЗрдЯреНрд╕ (12 + 4 + 4 * 10 + 6 рдмрдЯреНрд╕) рдкреНрд░рддрд┐ рдЯреНрдпреВрдкрд▓, рдЬреЛ рдХрд┐ рдЙрдирдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рд╕реНрдЯреЛрд░ рдХрд░реЗрдЧрд╛ред
UPD: рдЯрд╛рдЗрдкреЛред
UPD: "1 рдорд┐рд▓рд┐рдпрди рдкреНрд░рд╛рдЗрдореНрд╕" рдХреЗ рдмрдЬрд╛рдп рдЙрдкрд╢реАрд░реНрд╖рдХ рдореЗрдВ "1 рдорд┐рд▓рд┐рдпрди рдкреВрд░реНрдгрд╛рдВрдХ,"