рдПрдХ рдореЗрдореЛрд░реА рд╕рдорд╕реНрдпрд╛ рддрдм рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрдм рдХрд┐рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рд░реИрдо рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рдХреНрд░рд┐рдп рд╣реЛрддреЗ рд╣реИрдВ, рдЦрд╛рд╕рдХрд░ рдЕрдЧрд░ рдЙрдкрд▓рдмреНрдз рдореЗрдореЛрд░реА рдХреА рдХреБрд▓ рд░рд╛рд╢рд┐ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд╣реЛред
рдиреАрдЪреЗ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рдХреБрдЫ рддрд░реАрдХреЛрдВ рдХрд╛ рдЕрд╡рд▓реЛрдХрди рд╣реИ, рдЬреЛ рд╢реБрджреНрдз рдЕрдЬрдЧрд░ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ RAM рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдиреЛрдЯ: рдпрд╣ рдореЗрд░реА рдореВрд▓ рдкреЛрд╕реНрдЯ (рд░реВрд╕реА рдореЗрдВ) рдХрд╛ рдЕрдВрдЧреНрд░реЗрдЬреА рд╕рдВрд╕реНрдХрд░рдг рд╣реИред
рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╛рдпрдерди рдореЗрдВ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ рдирд╛рдо рдХреЗ рд╕рд╛рде рд╕рдордиреНрд╡рдп рдореВрд▓реНрдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ x
, y
, z
рд╕рд╛рде рдЕрдВрдХ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
dict
рдЫреЛрдЯреЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд▓рд┐рдкрд┐рдпреЛрдВ рдореЗрдВ, рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд dict
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ:
>>> ob = {'x':1, 'y':2, 'z':3} >>> x = ob['x'] >>> ob['y'] = y
рдкрд╛рдпрдерди 3.6 рдореЗрдВ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рдПрдХ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде, dict
рдФрд░ рднреА рдЖрдХрд░реНрд╖рдХ рд╣реЛ рдЧрдпрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдЗрдП рд░реИрдо рдореЗрдВ рдЗрд╕рдХреЗ рдкрджрдЪрд┐рд╣реНрди рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рджреЗрдЦреЗрдВ:
>>> print(sys.getsizeof(ob)) 240
рдпрд╣ рдмрд╣реБрдд рд╕рд╛рд░реА рдореЗрдореЛрд░реА рд▓реЗрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдЪрд╛рдирдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:
рдХрдХреНрд╖рд╛ рдЙрджрд╛рд╣рд░рдг
рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рд╕рдм рдХреБрдЫ рдмрдВрдж рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рд╕рдВрд░рдЪрдирд╛ рдирд╛рдо рдХреА рдкрд╣реБрдВрдЪ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ:
class Point: # def __init__(self, x, y, z): self.x = x self.y = y self.z = z >>> ob = Point(1,2,3) >>> x = ob.x >>> ob.y = y
рд╡рд░реНрдЧ рдЙрджрд╛рд╣рд░рдг рдХреА рд╕рдВрд░рдЪрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ:
рдпрд╣рд╛рдВ __weakref__
рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рддрдерд╛рдХрдерд┐рдд рдХрдордЬреЛрд░ рд╕рдВрджрд░реНрднреЛрдВ рдХреА рд╕реВрдЪреА рдХрд╛ рд╕рдВрджрд░реНрдн рд╣реИ, рдлрд╝реАрд▓реНрдб __dict__
рдХреНрд▓рд╛рд╕ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдбрд┐рдХреНрд╢рдирд░реА рдХрд╛ рд╕рдВрджрд░реНрдн рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдорд╛рди рд╢рд╛рдорд┐рд▓ рд╣реИрдВ (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ 64-рдмрд┐рдЯ рд╕рдВрджрд░реНрдн рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо 8 8tes рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рддрд╛ рд╣реИ)ред рдкрд╛рдпрдерди 3.3 рдореЗрдВ рд╢реБрд░реВ, рд╕рд╛рдЭрд╛ рд╕реНрдерд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдХреНрд╖рд╛ рдХреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ RAM рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдЯреНрд░реЗрд╕ рдХрд╛ рдЖрдХрд╛рд░ рдХрдо рдХрд░рддрд╛ рд╣реИ:
>>> print(sys.getsizeof(ob), sys.getsizeof(ob.__dict__)) 56 112
рдирддреАрдЬрддрди, рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡рд░реНрдЧ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдПрдХ рдирд┐рдпрдорд┐рдд рд╢рдмреНрджрдХреЛрд╢ ( dict
) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕реНрдореГрддрд┐ рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рдкрджрдЪрд┐рд╣реНрди рд╣реЛрддрд╛ рд╣реИ:
рдпрд╣ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рд░реИрдо рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЖрдХрд╛рд░ рдЕрднреА рднреА рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдХрд╛рд░рдг рдмрдбрд╝рд╛ рд╣реИред
__Slots__ рдХреЗ рд╕рд╛рде рдХрдХреНрд╖рд╛ рдХрд╛ рдЙрджрд╛рд╣рд░рдг
RAM рдореЗрдВ рдПрдХ рдХреНрд▓рд╛рд╕ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рдЖрдХрд╛рд░ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрдореА __dict__
рдФрд░ __weakref__
рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рддреА рд╣реИред рдпрд╣ __slots__
рд╕рд╛рде "рдЯреНрд░рд┐рдХ" рдХреА рдорджрдж рд╕реЗ рд╕рдВрднрд╡ рд╣реИ:
class Point: __slots__ = 'x', 'y', 'z' def __init__(self, x, y, z): self.x = x self.y = y self.z = z >>> ob = Point(1,2,3) >>> print(sys.getsizeof(ob)) 64
RAM рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЖрдХрд╛рд░ рдХрд╛рдлреА рдЫреЛрдЯрд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ:
рд╡рд░реНрдЧ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ __slots__
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╕реНрдореГрддрд┐ рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдкрджрдЪрд┐рд╣реНрди рдХрдо рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ:
рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдпрд╣ рд░реИрдо рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреА рдореЗрдореЛрд░реА рдлрд╝реБрдЯрдкреНрд░рд┐рдВрдЯ рдХреЛ рдХрд╛рдлреА рд╣рдж рддрдХ рдХрдо рдХрд░рдиреЗ рдХрд╛ рдореБрдЦреНрдп рддрд░реАрдХрд╛ рд╣реИред
рдпрд╣ рдХрдореА рдЗрд╕ рддрдереНрдп рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╢реАрд░реНрд╖рдХ рдХреЗ рдмрд╛рдж рдореЗрдореЛрд░реА рдореЗрдВ, рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рдВрджрд░реНрдн рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ - рд╡рд┐рд╢реЗрд╖рддрд╛ рдорд╛рди, рдФрд░ рдЙрди рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рд╡рд┐рд╢реЗрд╖ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдХрдХреНрд╖рд╛ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рд╣реИрдВ:
>>> pprint(Point.__dict__) mappingproxy( .................................... 'x': <member 'x' of 'Point' objects>, 'y': <member 'y' of 'Point' objects>, 'z': <member 'z' of 'Point' objects>})
__slots__
рд╕рд╛рде рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп [рдирд╛рдо рд╕реВрдЪреА] ( https://pypi.org/project/onymlist ) рд╣реИред рдирд╛рдо namedlist.namedlist
рдлрд╝рдВрдХреНрд╢рди namedlist.namedlist
рд╕рд╛рде рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рддрд╛ рд╣реИ:
>>> Point = namedlist('Point', ('x', 'y', 'z'))
рдПрдХ рдФрд░ рдкреИрдХреЗрдЬ [рдЕрдЯрд░реНрдореНрд╕] ( https://pypi.org/project/attrs ) рдЖрдкрдХреЛ __slots__
рд╕рд╛рде рдФрд░ рдмрд┐рдирд╛ рджреЛрдиреЛрдВ рдХреЗ рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЯрдкрд▓
рдкрд╛рдпрдерди рдореЗрдВ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рдХрд╛ tuple
рднреА рд╣реИред рдПрдХ рдЯрдкрд▓ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрд░рдЪрдирд╛ рдпрд╛ рд░рд┐рдХреЙрд░реНрдб рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрд╖реЗрддреНрд░ рдХреЗ рдирд╛рдо рдХреЗ рдмрд┐рдирд╛ред рдлрд╝реАрд▓реНрдб рдПрдХреНрд╕реЗрд╕ рдХреЗ рд▓рд┐рдП, рдлрд╝реАрд▓реНрдб рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЯрдкрд▓ рдХреНрд╖реЗрддреНрд░ рдПрдХ рдмрд╛рд░ рдФрд░ рд╕рднреА рдХреЗ рд▓рд┐рдП рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рдЬреЛ рдЯреВрдкрд▓ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╕рдордп рдореВрд▓реНрдп рд╡рд╕реНрддреБрдУрдВ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ:
>>> ob = (1,2,3) >>> x = ob[0] >>> ob[1] = y # ERROR
рдЯрдкрд▓ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛рдлреА рдХреЙрдореНрдкреИрдХреНрдЯ рд╣реИрдВ:
>>> print(sys.getsizeof(ob)) 72
рд╡реЗ __slots__
рд╕рд╛рде рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ 8 рдмрд╛рдЗрдЯреНрд╕ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдореГрддрд┐ рдореЗрдВ __slots__
рдЯреНрд░реЗрд╕ рдореЗрдВ рдХрдИ рдлрд╝реАрд▓реНрдб рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
Namedtuple
рдЪреВрдВрдХрд┐ рдЯреВрдкрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╣реБрдд рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рджрд┐рди рдПрдХ рдЕрдиреБрд░реЛрдз рдерд╛ рдХрд┐ рдЖрдк рдЕрднреА рднреА рдЦреЗрддреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдирд╛рдо рд╕реЗ рднреАред рдЗрд╕ рдЕрдиреБрд░реЛрдз рдХрд╛ рдЙрддреНрддрд░ рдореЙрдбреНрдпреВрд▓ collections.namedtuple
ред
рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд░реНрдЧ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП namedtuple
рдХрд╛рд░реНрдп рдХреЛ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
>>> Point = namedtuple('Point', ('x', 'y', 'z'))
рдпрд╣ рдЯрдкрд▓ рдХрд╛ рдПрдХ рдЙрдкрд╡рд░реНрдЧ рдмрдирд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рд╡рд░рдгрдХрд░реНрддрд╛ рдХреЛ рдирд╛рдо рд╕реЗ рдлрд╝реАрд▓реНрдб рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
class Point(tuple): # @property def _get_x(self): return self[0] @property def _get_y(self): return self[1] @property def _get_z(self): return self[2] # def __new__(cls, x, y, z): return tuple.__new__(cls, (x, y, z))
рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдПрдХ рдЯреБрдкрд▓ рдХреЗ рд╕рдорд╛рди рдПрдХ рд╕реНрдореГрддрд┐ рдкрджрдЪрд┐рд╣реНрди рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╕реНрдореГрддрд┐ рдкрджрдЪрд┐рд╣реНрди рдЫреЛрдбрд╝рддреА рд╣реИ:
рд░рд┐рдХреЙрд░реНрдбрдХреНрд▓рд╛рд╕: рдЪрдХреНрд░реАрдп рдЬреАрд╕реА рдХреЗ рдмрд┐рдирд╛ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдиреЗрдордЯреБрдкрд▓
рдЪреВрдВрдХрд┐ tuple
рдФрд░, рддрджрдиреБрд╕рд╛рд░, рдиреЗрдордЯреБрдкрд▓ -рдХреНрд▓реЗрд╕реЗрд╕ рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╡рд╕реНрддреБрдПрдВ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ ob.x
рдХреЛ рдЕрдм рдХрд┐рд╕реА рдЕрдиреНрдп рдорд╛рди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдПрдХ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдиреЗрдЯрд▓ рдЕрдк рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдЙрддреНрдкрдиреНрди рд╣реБрдЖ рд╣реИред рдЪреВрдВрдХрд┐ рдкрд╛рдпрдерди рдореЗрдВ рдХреЛрдИ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдХрд╛рд░реНрдп рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЯрдкрд▓ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдХрдИ рд╡рд┐рдХрд▓реНрдк рдмрдирд╛рдП рдЧрдП рд╣реИрдВред рд╣рдо [recordclass] ( https://pypi.org/project/recordclass ) рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕реЗ [stackoverflow] ( https://stackoverflow.com/questions/29290359/existence-of-mutable- рдмреЗрдирд╛рдо- рдХреА рд░реЗрдЯрд┐рдВрдЧ рдкреНрд░рд╛рдкреНрдд рд╣реБрдИ рд╣реИ tuple-in -python / 29419745)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ tuple
-рдЬреИрд╕реА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд░реИрдо рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдкреИрдХреЗрдЬ рд░рд┐рдХреЙрд░реНрдбрдХреНрд▓рд╛рд╕ рдЯрд╛рдЗрдк recordclass.mutabletuple рдХрд╛ рдкрд░рд┐рдЪрдп recordclass.mutabletuple
, рдЬреЛ рд▓рдЧрднрдЧ рдЯреНрдпреВрдкрд▓ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рднреА рдирд┐рдпреБрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЙрдк-рд╡рд░реНрдЧ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ рдЬреЛ рд▓рдЧрднрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд╛рдорд┐рдд рдирд╛рдо рдХреЗ рд╕рдорд╛рди рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдирдП рдорд╛рдиреЛрдВ рдХреЛ рдлрд╝реАрд▓реНрдб рдореЗрдВ (рдирдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдмрдирд╛рдП рдмрд┐рдирд╛) рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХрд╛ рднреА рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред recordclass
рдлрд╝рдВрдХреНрд╢рди, recordclass
рдлрд╝рдВрдХреНрд╢рди рдХреА рддрд░рд╣, рдЖрдкрдХреЛ рдЗрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
>>> Point = recordclass('Point', ('x', 'y', 'z')) >>> ob = Point(1, 2, 3)
рдХреНрд▓рд╛рд╕ рдЗрдВрд╕реНрдЯреЗрдВрд╕реЗрд╕ рдореЗрдВ PyGC_Head
рдХреЗ рд╕рдорд╛рди рд╕рдВрд░рдЪрдирд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ PyGC_Head
рдмрд┐рдирд╛:
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, recordclass
рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдЪрдХреНрд░реАрдп рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рддрдВрддреНрд░ рдореЗрдВ рднрд╛рдЧ рдирд╣реАрдВ рд▓реЗрддрд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░, recordclass
рдФрд░ recordclass
рдХрд╛ рдЙрдкрдпреЛрдЧ рд░рд┐рдХреЙрд░реНрдб рдпрд╛ рд╕рд░рд▓ (рдЧреИрд░-рдкреБрдирд░рд╛рд╡рд░реНрддреА) рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрдХреНрд╖рд╛рдПрдВ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд╛рдЗрдерди рдореЗрдВ рдЗрдирдХрд╛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╕рд░реНрдХреБрд▓рд░ рд░реЗрдлрд░реЗрдВрд╕ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, recordclass
рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ recordclass
, PyGC_Head fragment is excluded, which is necessary for classes supporting the cyclic garbage collection mechanism (more precisely: in the
PyTypebbject structure, corresponding to the created class, in the
рдЭрдВрдбреЗ рдХреЗ field, by default, the flag
Py_TPFLAGS_HAVE_GC 'рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ)ред
рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдореЗрдореЛрд░реА рдлрд╝реБрдЯрдкреНрд░рд┐рдВрдЯ рдХрд╛ рдЖрдХрд╛рд░ __slots__
рд╕рд╛рде рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЫреЛрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ:
Dataobject
рд░рд┐рдХреЙрд░реНрдбрдХреНрд▓рд╛рд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдПрдХ рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рди рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ: __slots__
рд╕рд╛рде рд╡рд░реНрдЧ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдореЗрдореЛрд░реА рдореЗрдВ рд╕рдорд╛рди рднрдВрдбрд╛рд░рдг рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдЪрдХреНрд░реАрдп рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рддрдВрддреНрд░ рдореЗрдВ рднрд╛рдЧ рди рд▓реЗрдВред рдЗрд╕ рддрд░рд╣ рдХреА рдХрдХреНрд╖рд╛рдПрдВ recordclass.make_dataclass
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрддреНрдкрдиреНрди рдХреА recordclass.make_dataclass
рд╣реИрдВ:
>>> Point = make_dataclass('Point', ('x', 'y', 'z'))
рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╡рд░реНрдЧ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИред
рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ - recordclass.dataobject
рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд╕рд╛рде рд╡рд░реНрдЧ рдШреЛрд╖рдгрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
class Point(dataobject): x:int y:int z:int
рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рдХрдХреНрд╖рд╛рдПрдВ рдРрд╕реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреА рдЬреЛ рдЪрдХреНрд░реАрдп рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рддрдВрддреНрд░ рдореЗрдВ рднрд╛рдЧ рдирд╣реАрдВ рд▓реЗрддреЗ рд╣реИрдВред рд╕реНрдореГрддрд┐ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдХреА рд╕рдВрд░рдЪрдирд╛ __slots__
рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ __slots__
, рд▓реЗрдХрд┐рди PyGC_Head
рдмрд┐рдирд╛:
>>> ob = Point(1,2,3) >>> print(sys.getsizeof(ob)) 40
рдЦреЗрддреЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд┐рд╢реЗрд╖ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдлрд╝реАрд▓реНрдб рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрдХреНрд╖рд╛ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВ:
mappingproxy({'__new__': <staticmethod at 0x7f203c4e6be0>, ....................................... 'x': <recordclass.dataobject.dataslotgetset at 0x7f203c55c690>, 'y': <recordclass.dataobject.dataslotgetset at 0x7f203c55c670>, 'z': <recordclass.dataobject.dataslotgetset at 0x7f203c55c410>})
рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕реНрдореГрддрд┐ рдкрджрдЪрд┐рд╣реНрди рдХрд╛ рдЖрдХрд╛рд░ CPython рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рд╕рдВрднрд╡ рд╣реИ:
Cython
[рд╕рд╛рдЗрдереЙрди] ( https://cython.org ) рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИред рдЗрд╕рдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдХреНрд╖реЗрддреНрд░ рд╕реА рднрд╛рд╖рд╛ рдкрд░рдорд╛рдгреБ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдкрд░ рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╢реБрджреНрдз рдкрд╛рдпрдерди рд╕реЗ рдЦреЗрддреЛрдВ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░реНрд╕ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
cdef class Python: cdef public int x, y, z def __init__(self, x, y, z): self.x = x self.y = y self.z = z
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдореЗрдореЛрд░реА рдХрд╛ рдЖрдХрд╛рд░ рднреА рдЫреЛрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ:
>>> ob = Point(1,2,3) >>> print(sys.getsizeof(ob)) 32
рд╕реНрдореГрддрд┐ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдЯреНрд░реЗрд╕ рдореЗрдВ рдирд┐рдореНрди рд╕рдВрд░рдЪрдирд╛ рд╣реЛрддреА рд╣реИ:
рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкреНрд░рддрд┐рдпреЛрдВ рдХреЗ рдкрджрдЪрд┐рд╣реНрди рдХрд╛ рдЖрдХрд╛рд░ рдХрдо рд╣реИ:
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЬрдм рдкрд╛рдпрдерди рдХреЛрдб рд╕реЗ рдкреНрд░рд╡реЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рд░ рдмрд╛рд░ int
рд╕реЗ Python рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
Numpy
рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдЖрдпрд╛рдореА рд╕рд░рдгрд┐рдпреЛрдВ рдпрд╛ рдЕрднрд┐рд▓реЗрдЦреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реНрдореГрддрд┐ рдореЗрдВ рд▓рд╛рдн рджреЗрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╢реБрджреНрдз рдкрд╛рдпрдерди рдореЗрдВ рдХреБрд╢рд▓ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдХрд┐ numpy
рдкреИрдХреЗрдЬ рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
>>> Point = numpy.dtype(('x', numpy.int32), ('y', numpy.int32), ('z', numpy.int32)])
рд╢реВрдиреНрдп рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдЖрд░рдВрднреАрдХреГрдд N
рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА, рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдИ рдЧрдИ рд╣реИ:
>>> points = numpy.zeros(N, dtype=Point)
рд╕реНрдореГрддрд┐ рдореЗрдВ рд╕рд░рдгреА рдХрд╛ рдЖрдХрд╛рд░ рдиреНрдпреВрдирддрдо рд╕рдВрднрд╡ рд╣реИ:
рд╕рд░рдгреА рддрддреНрд╡реЛрдВ рдФрд░ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдкрд╣реБрдБрдЪ рдХреЛ рдкрд╛рдпрдерди рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ C int
рдорд╛рди рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдПрдХ рдПрдХрд▓ рдкрдВрдХреНрддрд┐ рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рд╕реЗ рдПрдХ рд╕рд░рдгреА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХрд▓ рддрддреНрд╡ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЯреНрд░реЗрд╕ рдЕрдм рдЗрддрдирд╛ рдХреЙрдореНрдкреИрдХреНрдЯ рдирд╣реАрдВ рд╣реЛрдЧрд╛:
>>> sys.getsizeof(points[0]) 68
рдЗрд╕рд▓рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдкрд╛рдпрдерди рдХреЛрдб рдореЗрдВ, numpy
рдкреИрдХреЗрдЬ рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рдПрдХ рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдкрд░, рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛ рдХрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдкрд╛рдпрдерди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ (рд╕реАрдкреАрдереЙрди) рд╕рдореБрджрд╛рдп рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕реНрдореГрддрд┐ рдХреА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрдореА рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рд╣реИрдВред