рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп рдкрд╛рдпрдерди рдХрд┐рддрдиреА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдХрд░рддрд╛ рд╣реИ?

рдХреБрдЫ рдкрд╛рдпрдерди рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдмрд╣реБрдд рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдЬрдм рдЙрдиреНрд╣реЗрдВ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЪрд▓рдиреЗ рдХреЗ рджреМрд░рд╛рди рдЕрдЬрдЧрд░ рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рдХрд┐рддрдиреА рдЕрд╕реНрдерд╛рдпреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИред

рд╕реАрдкреАрдереЙрди рдЖрдкрдХреЛ рдЖрд╡рдВрдЯрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдкрд░ рдЖрдВрдХрдбрд╝реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдЭрдВрдбреЗ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

./configure CFLAGS='-DCOUNT_ALLOCS' --with-pydebug make -s -j2 

рд╕рдВрдХрд▓рди рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ REPL рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрдБрдХрдбрд╝реЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 >>> import sys >>> sys.getcounts() [('iterator', 7, 7, 4), ('functools._lru_cache_wrapper', 1, 0, 1), ('re.Match', 2, 2, 1), ('re.Pattern', 3, 2, 1), ('SubPattern', 10, 10, 8), ('Pattern', 3, 3, 1), ('IndexError', 4, 4, 1), ('Tokenizer', 3, 3, 1), ('odict_keys', 1, 1, 1), ('odict_iterator', 18, 18, 1), ('odict_items', 17, 17, 1), ('RegexFlag', 18, 8, 10), ('operator.itemgetter', 4, 0, 4), ('PyCapsule', 1, 1, 1), ('Repr', 1, 0, 1), ('_NamedIntConstant', 74, 0, 74), ('collections.OrderedDict', 5, 0, 5), ('EnumMeta', 5, 0, 5), ('DynamicClassAttribute', 2, 0, 2), ('_EnumDict', 5, 5, 1), ('TypeError', 1, 1, 1), ('method-wrapper', 365, 365, 2), ('_C', 1, 1, 1), ('symtable entry', 5, 5, 2), ('OSError', 1, 1, 1), ('Completer', 1, 0, 1), ('ExtensionFileLoader', 2, 0, 2), ('ModuleNotFoundError', 2, 2, 1), ('_Helper', 1, 0, 1), ('_Printer', 3, 0, 3), ('Quitter', 2, 0, 2), ('enumerate', 5, 5, 1), ('_io.IncrementalNewlineDecoder', 1, 1, 1), ('map', 25, 25, 1), ('_Environ', 2, 0, 2), ('async_generator', 2, 1, 1), ('coroutine', 2, 2, 1), ('zip', 1, 1, 1), ('longrange_iterator', 1, 1, 1), ('range_iterator', 7, 7, 1), ('range', 14, 14, 2), ('list_reverseiterator', 2, 2, 1), ('dict_valueiterator', 1, 1, 1), ('dict_values', 2, 2, 1), ('dict_keyiterator', 25, 25, 1), ('dict_keys', 5, 5, 1), ('bytearray_iterator', 1, 1, 1), ('bytearray', 4, 4, 1), ('bytes_iterator', 2, 2, 1), ('IncrementalEncoder', 2, 0, 2), ('_io.BufferedWriter', 2, 0, 2), ('IncrementalDecoder', 2, 1, 2), ('_io.TextIOWrapper', 4, 1, 4), ('_io.BufferedReader', 2, 1, 2), ('_abc_data', 39, 0, 39), ('mappingproxy', 199, 199, 1), ('ABCMeta', 39, 0, 39), ('CodecInfo', 1, 0, 1), ('str_iterator', 7, 7, 1), ('memoryview', 60, 60, 2), ('managedbuffer', 31, 31, 1), ('slice', 589, 589, 1), ('_io.FileIO', 33, 30, 5), ('SourceFileLoader', 29, 0, 29), ('set', 166, 101, 80), ('StopIteration', 33, 33, 1), ('FileFinder', 11, 0, 11), ('os.stat_result', 145, 145, 1), ('ImportError', 2, 2, 1), ('FileNotFoundError', 10, 10, 1), ('ZipImportError', 12, 12, 1), ('zipimport.zipimporter', 12, 12, 1), ('NameError', 4, 4, 1), ('set_iterator', 46, 46, 1), ('frozenset', 50, 0, 50), ('_ImportLockContext', 113, 113, 1), ('list_iterator', 305, 305, 5), ('_thread.lock', 92, 92, 10), ('_ModuleLock', 46, 46, 5), ('KeyError', 67, 67, 2), ('_ModuleLockManager', 46, 46, 5), ('generator', 125, 125, 1), ('_installed_safely', 52, 52, 5), ('method', 1095, 1093, 14), ('ModuleSpec', 58, 4, 54), ('AttributeError', 22, 22, 1), ('traceback', 154, 154, 3), ('dict_itemiterator', 45, 45, 1), ('dict_items', 46, 46, 1), ('object', 8, 1, 7), ('tuple_iterator', 631, 631, 3), ('cell', 71, 31, 42), ('classmethod', 58, 0, 58), ('property', 18, 2, 16), ('super', 360, 360, 1), ('type', 78, 3, 75), ('function', 1705, 785, 922), ('frame', 5442, 5440, 36), ('code', 1280, 276, 1063), ('bytes', 2999, 965, 2154), ('Token.MISSING', 1, 0, 1), ('stderrprinter', 1, 1, 1), ('MemoryError', 16, 16, 16), ('sys.thread_info', 1, 0, 1), ('sys.flags', 2, 0, 2), ('types.SimpleNamespace', 1, 0, 1), ('sys.version_info', 1, 0, 1), ('sys.hash_info', 1, 0, 1), ('sys.int_info', 1, 0, 1), ('float', 584, 569, 20), ('sys.float_info', 1, 0, 1), ('module', 56, 0, 56), ('staticmethod', 16, 0, 16), ('weakref', 505, 82, 426), ('int', 3540, 2775, 766), ('member_descriptor', 246, 10, 239), ('list', 992, 919, 85), ('getset_descriptor', 240, 4, 240), ('classmethod_descriptor', 12, 0, 12), ('method_descriptor', 678, 0, 678), ('builtin_function_or_method', 1796, 1151, 651), ('wrapper_descriptor', 1031, 5, 1026), ('str', 16156, 9272, 6950), ('dict', 1696, 900, 810), ('tuple', 10367, 6110, 4337)] 

рдЪрд▓рд┐рдП рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдкрдардиреАрдп рдмрдирд╛рддреЗ рд╣реИрдВ:

 def print_allocations(top_k=None): allocs = sys.getcounts() if top_k: allocs = sorted(allocs, key=lambda tup: tup[1], reverse=True)[0:top_k] for obj in allocs: alive = obj[1]-obj[2] print("Type {}, allocs: {}, deallocs: {}, max: {}, alive: {}".format(*obj,alive)) 

 >>> print_allocations(10) Type str, allocs: 17328, deallocs: 10312, max: 7016, alive: 7016 Type tuple, allocs: 10550, deallocs: 6161, max: 4389, alive: 4389 Type frame, allocs: 5445, deallocs: 5442, max: 36, alive: 3 Type int, allocs: 3988, deallocs: 3175, max: 813, alive: 813 Type bytes, allocs: 3031, deallocs: 1044, max: 2154, alive: 1987 Type builtin_function_or_method, allocs: 1809, deallocs: 1164, max: 651, alive: 645 Type dict, allocs: 1726, deallocs: 930, max: 815, alive: 796 Type function, allocs: 1706, deallocs: 811, max: 922, alive: 895 Type code, allocs: 1284, deallocs: 304, max: 1063, alive: 980 Type method, allocs: 1095, deallocs: 1093, max: 14, alive: 2 

рдЬрд╣рд╛рдВ:

  • рдСрд▓реНрдЯрд░рд╕ - рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рдмрд╛рдж рд╕реЗ рдХрд┐рддрдиреЗ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ
  • рд╕реМрджрд╛ - рдХрд┐рддрдиреА рд╡рд╕реНрддреБрдПрдВ рд╣рдЯрд╛ рджреА рдЧрдИрдВ (рдореИрдиреНрдпреБрдЕрд▓ рдпрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ)
  • рд╕рдЬреАрд╡ - рд╕рдЬреАрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ (рд╡рд░реНрддрдорд╛рди) рд╡рд╕реНрддреБрдПрдВ (рдПрд▓реЛрдХрд╕ - рдбреАрд▓рд▓реЙрдХреНрд╕)
  • рдЕрдзрд┐рдХрддрдо - рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рдмрд╛рдж рд╕реЗ рдЬреАрд╡рд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЦрд╛рд▓реА рдкрд╛рдпрдерди рдЖрд░рдИрдкреАрдПрд▓ 17,328 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдФрд░ 10,550 рдЯреБрдкрд▓реНрд╕ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ред рдпрд╣ рд╡рд╕реНрддреБрдУрдВ рдХреА рдХреБрдЫ рдкрд╛рдЧрд▓ рд░рд╛рд╢рд┐ рд╣реИ! рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ REPL рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╛рдпрдерди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдореЙрдбреНрдпреВрд▓ рдЖрдпрд╛рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЦрд╛рд▓реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдпрд╛рдд рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдЕрдм рдлреНрд▓рд╛рд╕реНрдХ рдкрд░ "рд╣реИрд▓реЛ, рд╡рд░реНрд▓реНрдб" рдЯреЗрд╕реНрдЯ рдХрд░реЗрдВ:

 import sys from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): print_allocations(15) return 'Hello, World!' 

 ./python -m flask run ab -n 100 http://127.0.0.1:5000/ 

рд╣рдорд╛рд░реЗ рд╕рд░реНрд╡рд░ рдкрд░ 100 HTTP рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдВрдХрдбрд╝реЗ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ:

 Type str, allocs: 192649, deallocs: 138892, max: 54320, alive: 53757 Type frame, allocs: 191752, deallocs: 191714, max: 158, alive: 38 Type tuple, allocs: 183474, deallocs: 150069, max: 33581, alive: 33405 Type int, allocs: 85154, deallocs: 81100, max: 4115, alive: 4054 Type bytes, allocs: 31671, deallocs: 14331, max: 17381, alive: 17340 Type list, allocs: 29846, deallocs: 27541, max: 2415, alive: 2305 Type builtin_function_or_method, allocs: 28525, deallocs: 27572, max: 957, alive: 953 Type dict, allocs: 19900, deallocs: 14800, max: 5280, alive: 5100 Type method, allocs: 15170, deallocs: 15105, max: 74, alive: 65 Type function, allocs: 14761, deallocs: 7086, max: 7711, alive: 7675 Type slice, allocs: 12521, deallocs: 12521, max: 1, alive: 0 Type list_iterator, allocs: 10795, deallocs: 10795, max: 35, alive: 0 Type code, allocs: 9849, deallocs: 1749, max: 8107, alive: 8100 Type tuple_iterator, allocs: 8938, deallocs: 8938, max: 4, alive: 0 Type float, allocs: 6033, deallocs: 5889, max: 152, alive: 144 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рджреБрднрд╛рд╖рд┐рдпрд╛ рдиреЗ рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рдмрд╛рдж рд╕реЗ 847,261 рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдП рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрд╕реНрдерд╛рдпреА рдереЗ ( 714,336 ) рдФрд░ рдЬреИрд╕реЗ рд╣реА рдЙрдиреНрд╣реЗрдВ рдЬрд░реВрд░рдд рдирд╣реАрдВ рдереА, рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ред рд╢реЗрд╖ рд╡рд╕реНрддреБрдПрдВ ( 132 925 ) рдЕрднреА рднреА рд╕реНрдореГрддрд┐ рдореЗрдВ рд╣реИрдВред

рдлреНрд░реЗрдореНрд╕ рдФрд░ рдХреЛрдб рдСрдмреНрдЬреЗрдХреНрдЯ


рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЖрдк рдХрдИ рдлреНрд░реЗрдо рдФрд░ рдХреЛрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?

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

рдпреЗ рд╕рднреА рд╡рд╕реНрддреБрдПрдБ рдХрд╣рд╛рдБ рд╕реЗ рдЖрддреА рд╣реИрдВ?


рдкрд╛рдпрдерди рдПрдХ рдмрд╣реБрдд рд╣реА рдЧрддрд┐рд╢реАрд▓ рднрд╛рд╖рд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЧрддрд┐рд╢реАрд▓ рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд╣ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЕрд╕реНрдерд╛рдпреА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рд╣рд╛рдпрдХ рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдХрдо рд╕реЗ рдХрдо 5 рд╢рдмреНрджрдХреЛрд╢, 5 рдЯреНрдпреВрдкрд▓ рдФрд░ 4 рд╕реВрдЪрд┐рдпрд╛рдВ рдмрдирддреА рд╣реИрдВред рдпреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЕрдВрдд рддрдХ рд░рд╣реЗрдВрдЧреЗред рдмрджрд▓реЗ рдореЗрдВ, рдпреЗ рд╕рднреА рд╡рд╕реНрддреБрдПрдВ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдЕрдиреНрдп рд╡рд╕реНрддреБрдУрдВ (рдЙрдирдХреЗ рддрддреНрд╡реЛрдВ) рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИрдВ, рдпреЗ рджрд░реНрдЬрдиреЛрдВ рд╣реИрдВ, рдХрднреА-рдХрднреА рд╕рдВрдХрд▓рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрдВрддрд░рд┐рдХ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕реИрдХрдбрд╝реЛрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВред рдФрд╕рдд рд╡рд░реНрдЧ рдХрд╛ рд╡рд░реНрдгрди рд╕реИрдХрдбрд╝реЛрдВ рдХрдВрдЯреЗрдирд░ (рд╢рдмреНрджрдХреЛрд╢реЛрдВ, рдЯреБрдкрд▓реНрд╕, рд╕реВрдЪрд┐рдпреЛрдВ) рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, рдпрд╣рд╛рдВ рдЖрд╡рдВрдЯрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕рдЯреАрдХ рд╕рдВрдЦреНрдпрд╛ рдХреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЧрдгрдирд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдФрд░ рдпреЗ рдЖрдВрдХрдбрд╝реЗ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реИрдВред

рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рдмрдбрд╝реА рдФрд░ рдмрд╣реБ-рдкрд░рдд рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕реНрдореГрддрд┐ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЖрд╡рдВрдЯрди рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рддрд╛ рд╣реИред

рдХрднреА-рдХрднреА рдХреЛрдИ рдЖрд╢реНрдЪрд░реНрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЧрдИ рднрд╛рд╖рд╛рдПрдВ рд╣рдорд╕реЗ рдХрд┐рддрдиреА рдЫрд┐рдкреА рд╣реИрдВред рдкрд╛рдпрдерди рдЖрдкрдХреЛ рдмрд╣реБрдд рд╕рд╛рд░реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдФрд░ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рдмрд┐рдирд╛ рдЕрдЪреНрдЫрд╛ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдкреБрдирд╢реНрдЪ: рдореИрдВ рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рд▓реЗрдЦрдХ рд╣реВрдВ, рдЖрдк рдХреЛрдИ рднреА рдкреНрд░рд╢реНрди рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВред

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


All Articles