рдкрд╛рдпрдерди рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ

рдЫрд╡рд┐

1 рдорд┐рд▓рд┐рдпрди рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдореЗрдВ рдХрд┐рддрдиреА рдореЗрдореЛрд░реА рд▓рдЧрддреА рд╣реИ?


рдореИрдВ рдЕрдХреНрд╕рд░ рдЗрд╕ рд╕реЛрдЪ рд╕реЗ рд╣реИрд░рд╛рди рдерд╛ рдХрд┐ рдкрд╛рдпрдерди рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕реНрдореГрддрд┐ рдХрд╛ рдХрд┐рддрдиреА рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 1 рдорд┐рд▓рд┐рдпрди рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рддрдиреА рдореЗрдореЛрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдФрд░ рдордирдорд╛рдиреА рд▓рдВрдмрд╛рдИ рдХреА рд╕рдорд╛рди рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде?
рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдкрд╛рдпрдерди рдореЗрдВ рд╕реА рдореЗрдВ рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓рд┐рдП рдмрд┐рдирд╛ рд╕реАрдзреЗ рдЗрдВрдЯрд░рдПрдХреНрдЯрд┐рд╡ рдХрдВрд╕реЛрд▓ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрд╡рд╕рд░ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐, рдирд┐рд╖реНрдард╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрднреА рднреА рд╡рд╣реАрдВ рджреЗрдЦрддреЗ рд╣реИрдВ)ред
рдЬрд┐рдЬреНрдЮрд╛рд╕рд╛ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдХреЗ, рд╣рдо рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЕрдВрджрд░ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрдореЛрд░реА рдХрд┐рд╕ рдкрд░ рдЦрд░реНрдЪ рдХреА рдЬрд╛рддреА рд╣реИред

рд╕рднреА рдЙрджрд╛рд╣рд░рдг CPython рд╕рдВрд╕реНрдХрд░рдг 2.7.4 рдореЗрдВ 32 рдмрд┐рдЯ рдорд╢реАрди рдкрд░ рдмрдирд╛рдП рдЧрдП рдереЗред рдЕрдВрдд рдореЗрдВ 64 рдмрд┐рдЯ рдорд╢реАрди рдкрд░ рдореЗрдореЛрд░реА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЗрдмрд▓ рд╣реИред

рдЖрд╡рд╢реНрдпрдХ рдЙрдкрдХрд░рдг


sys.getsizeof рдФрд░ __sizeof __ () рд╡рд┐рдзрд┐

рдкрд╣рд▓рд╛ рдЙрдкрдХрд░рдг рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП рд╡рд╣ sys рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╣реИред рд╣рдо рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдЙрджреНрдзреГрдд рдХрд░рддреЗ рд╣реИрдВ:

sys.getsizeof (рдСрдмреНрдЬреЗрдХреНрдЯ [, default_value])

рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЖрдХрд╛рд░ рджреЗрддрд╛ рд╣реИред
рдпрджрд┐ рдХреЛрдИ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, TypeError рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЧреЗрдЯреНрд╕рд┐рдлрд╝реЙрдлрд╝ () __sizeof__ рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рд╕рдВрдЧреНрд░рд╣реАрдд рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЖрдХрд╛рд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИред


рдЧреЗрдЯрд┐рдЬрд╝реЛрдлрд╝ рдХрд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо (), рдкрд╛рдпрдерди рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛, рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:
Py_TPFLAGS_HAVE_GC = 1 << 14 # .     0b100000000000000 def sys_getsizeof(obj, default = None)     if obj.hasattr('__sizeof__'):         size = obj.__sizeof__()     elif default is not None:         return default     else:         raise TypeError('    __sizeof__')     #       HAVE_GC     if type(obj).__flags__ & Py_TPFLAGS_HAVE_GC:         size = size +  PyGC_Head     return size 


рдЬрд╣рд╛рдВ 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рдПрд▓ рдПрд▓ рдПрд▓1224
рдирд╛рд╡PyFloatObjectlld1624
strPyStringObjectLLLli + c * (рд▓рдВрдмрд╛рдИ + 1)21 + рд▓рдВрдмрд╛рдИ37 + рд▓рдВрдмрд╛рдИ
рдпреВрдирд┐рдХреЛрдбPyUnicodeObjectLLLLlLрдПрд▓ * (рд▓рдВрдмрд╛рдИ + 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 * рд▓рдВрдмрд╛рдИ
рд╡рд╣рд╛рдБ рд╣реИ
dictPyDictObjectрдПрд▓ * 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 рдорд┐рд▓рд┐рдпрди рдкреВрд░реНрдгрд╛рдВрдХ,"

Source: https://habr.com/ru/post/In193890/


All Articles