рдХрд╛рд░реНрдп рд╡рд┐рд╡рд░рдг
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реЗрд╡рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЕрдиреБрд░реЛрдз рдкрд░ рд╣рдореЗрдВ рдХреЛрдИ рднреА рдЬрд╛рдирдХрд╛рд░реА рджреЗрдЧреА рдФрд░ рдЬрд┐рддрдиреА рдЬрд▓реНрджреА рд╣реЛ рд╕рдХреЗ рдЗрд╕реЗ рджреЗ рджреЗрдЧреАред рдХреЛрдИ рднреА рд╕рд╛рдорд╛рдиреНрдп рд╡реНрдпрдХреНрддрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ? рдпрд╣ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЕрдиреБрд░реЛрдзрд┐рдд рдбреЗрдЯрд╛ рдХреЛ рдХреИрд╢ рдХрд░рддрд╛ рд╣реИред рд╡рд╣реАрдВ, рдЕрдЧрд░ рдЖрдк рднрд╡рд┐рд╖реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рднреА рд╕реЛрдЪрддреЗ рд╣реИрдВ, рддреЛ рдХреИрд╢ рдХрд╛ рдЖрдХрд╛рд░ рд╕реАрдорд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП, рдкрд╛рдпрдерди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдХреИрд╢ рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рддреЗ рд╣реИрдВ (
рдпрд╣рд╛рдБ рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдЖрдХрд╛рд░ рдореЗрдВ рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рд╕рдорд╛рди рд╣реИ, рдФрд░ рдпрд╣ рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдкрд╛рдпрдерди рдСрдмреНрдЬреЗрдХреНрдЯ рджреНрд╡рд╛рд░рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдмреНрдЬрд╛ рдХреА рдЧрдИ рдореЗрдореЛрд░реА рдХреА рдорд╛рддреНрд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рдЧреИрд░-рддреБрдЪреНрдЫ рдХрд╛рд░реНрдп рд╣реИ, рдЬреЛ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рдЙрд╕реЗ рдпрд╣рд╛рдВ рдЖрдиреЗ рджреЗрдВ ), рдФрд░ рдХреИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬрд┐рддрдиреА рдмрд╛рд░ рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рдирдХрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП - рд╣рдо рдЗрд╕реЗ
рдХрдо рд╕реЗ
рдХрдо рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рдмрдирд╛рдПрдВрдЧреЗ, рдЕрд░реНрдерд╛рддреНред рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рд╕рдордп рдкрд╣рд▓реЗ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛, рдЙрддрдиреЗ рдЕрдзрд┐рдХ рдореМрдХреЗ рдЙрдирдХреЗ рдкрд╛рд╕ рдХреИрд╢ рдХреЗ "рдЙрдбрд╝рдиреЗ" рдХреЗ рдереЗред
рдореИрдВ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рджреЛ рд╕рдорд╛рдзрд╛рдиреЛрдВ (рд╕рд░рд▓ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред
рджрд╛рд░реНрд╢рдирд┐рдХ рд╡рд╛рдкрд╕реА
рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдЕрдХреНрд╕рд░ рдкрд╛рдпрдерди рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рдореЗрдореЛрд░реА рдЦрдкрдд рдпрд╛ рдЧрддрд┐ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрдиреБрдХреВрд▓рди рдирд╣реАрдВ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ (
рдпрд╣рд╛рдВ рдЖрдк рдкрд╛рд╕рд┐рдВрдЧ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рдЧрд▓рддреА рдирд╣реАрдВ рд╣реИ рдЬреЛ рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдмрд╕ рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рдЯреВрд▓рдХрд┐рдЯ рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ ( рд╣рд╛рдВ, рдореИрдВ cProfile рд╕реЗ рдЕрд╡рдЧрдд рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдореЗрд╢рд╛ рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕рдореЗрдВ рдЕрдЯреИрдЪ-рдбрд┐рдЯреИрдЪ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ; рдореЗрдореЛрд░реА рд▓реАрдХ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдорддреМрд░ рдкрд░ рджрд┐рд▓ рдХреЗ рдмреЗрд╣реЛрд╢ рд╣реЛрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдЕрдЧрд░ рдкрд┐рдВрдкрд▓ рдЦрддреНрдо рд╣реЛ рдЧрдпрд╛ рд╣реИ ...), рдЕрдЧрд░ рдХреЛрдИ рдореБрдЭрд╕реЗ рдХрд╣рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ред )ред рдореВрд▓ рд░реВрдк рд╕реЗ, рдпрд╣ рдФрд░ рднреА рд╕рд╣реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдорддреМрд░ рдкрд░ рдкрд╛рдпрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдпрд╛ рдореЗрдореЛрд░реА рдХреА рдЦрдкрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдб рдХреЛ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд▓рдЧрдиреЗ рд╡рд╛рд▓рд╛ рд╕рдордп рдФрд░ рдЗрд╕рдХреЗ рдЖрдЧреЗ рдХреЗ рд╕рдорд░реНрдерди рдХреА рд╕рд╛рджрдЧреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯ, рдпрджреНрдпрдкрд┐ рдХрдо рдХрд┐рдлрд╛рдпрддреА, рд╕рдорд╛рдзрд╛рди рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ред
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рдкрд╛рдпрдерди рдХреЛрдб рдХреЛ "рдХрд┐рд╕реА рднреА рддрд░рд╣" рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрднреА-рдХрднреА рдкреНрд░рджрд░реНрд╢рди рдФрд░ рдореЗрдореЛрд░реА рдЦрдкрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛ рд╕рдХрддреА рд╣реИ, рднрд▓реЗ рд╣реА рдХреЛрдб рдПрдХ рдЕрдЪреНрдЫреЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдФрд░ рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░ рдорд╢реАрди рдкрд░ рдЪрд▓рддрд╛ рд╣реЛред
рдмрд╕ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдорд╛рдорд▓реЗ (рд╕реАрдкреАрдпреВ рд╕рдордп рдХреА рдХрдореА) рдФрд░ рдореБрдЭреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдПрдХ рдХреИрд╢рд┐рдВрдЧ рд╡рд░реНрдЧ рдХреЛ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдПред
рд╕рд░рд▓ рдЙрдкрд╛рдп
рдпрд╣ рдЕрдХреНрд╕рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ - "рдПрдХ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рд╕рд╣реА рд╣реИ", рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рд╣рдореЗрд╢рд╛ рдХреЗ рдорд╛рдорд▓реЗ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИ, рдХреНрдпрд╛ рдпрд╣ рд╣реИ? рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рдХреЛрдИ рдХреИрд╢ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдЧрддрд┐ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рдирд╣реАрдВ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреЛ рдЗрд╕ рдХреИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдмрд╣реБрдд рдзреАрдорд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдирд┐рд╡реЗрд╢ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ), рддреЛ рдЖрдк рддреБрдЪреНрдЫ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рддреЛ, рдПрдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди:
import weakref class SimpleCache: def __init__(self, cacheSize): self.cache = weakref.WeakValueDictionary() self.cache_LRU = [] self.cacheSize = cacheSize def __getitem__(self, key):
рдХреЗ рдЙрдкрдпреЛрдЧ
рдЖрдк рд╕реГрдЬрди рдХреЗ рдмрд╛рдж рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреИрд╢ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдПрдХ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдПрдХ рддрддреНрд╡ рдХреЛ рдкрдврд╝рдирд╛ / рд▓рд┐рдЦрдирд╛ рдпрд╣ рдХрддрд╛рд░ рдХреЗ рдЕрдВрдд рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ WeakValueDictionary () рдФрд░ рдПрдХ рд╕реВрдЪреА рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рдХрд╛рд░рдг рдЬреЛ рдХреЛрдИ рдФрд░ рдЕрдзрд┐рдХ рддрддреНрд╡ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдПрдХ рд╕реАрдорд╛ рдорд┐рд▓рддреА рд╣реИред рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ред
рдЗрд╕рд▓рд┐рдП рдХреЛрдб рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж
cache = SimpleCache(2) cache[1] = 'a' cache[2] = 'b' cache[3] = 'c'
рдХреЗрд╡рд▓ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ 'b' рдФрд░ 'c' рдХреИрд╢ рдореЗрдВ рд░рд╣реЗрдВрдЧреА ('a', рдЬреИрд╕рд╛ рдХрд┐ рд╕рдмрд╕реЗ рдкреБрд░рд╛рдирд╛ рд╣реИ, рдкрд╣рд▓реЗ рд╕реЗ рд▓рд┐рдЦрд╛ рд╣реЛрдЧрд╛)ред
рдлрд╛рдпрджреЗ рдФрд░ рдиреБрдХрд╕рд╛рди
рд▓рд╛рдн рд╕рд╛рдкреЗрдХреНрд╖ рд╕рд╛рджрдЧреА рд╣реИ (рд▓рдЧрднрдЧ 20 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдХреЛрдб, WeakValueDictionary рдкрд░ рдкреНрд░рд▓реЗрдЦрди рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдСрдкрд░реЗрд╢рди рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ)ред
рдиреБрдХрд╕рд╛рди рдХрд╛рдо рдХреА рдЧрддрд┐ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдХреИрд╢ рдХреЛ "рдЯрдЪ" рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдкреВрд░реА рд╕реВрдЪреА рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛, рдПрдХ рддрддреНрд╡ рдХреЛ рдЙрд╕рдХреЗ рдордирдорд╛рдиреЗ рд╕реНрдерд╛рди рд╕реЗ рд╣рдЯрд╛рдирд╛ рд╣реЛрдЧрд╛ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рд▓рдВрдмреЗ рдСрдкрд░реЗрд╢рди рдХрд╛ рдПрдХ рдкреВрд░рд╛ рдЧреБрдЪреНрдЫрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рдпрджрд┐ self.cache_LRU рдореЗрдВ рдореВрд▓реНрдп - рд╕реВрдЪреА рдореЗрдВ рдПрдХ рд░реЗрдЦреАрдп рдЦреЛрдЬ рд╣реИ, рддреЛ) .remove () - рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдПрдХ рд░реЗрдЦреАрдп рдЦреЛрдЬ, рдлрд┐рд░ рдПрдХ рдФрд░ рдЯреБрдХрдбрд╝рд╛ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдпрд╛рдиреА рд╕реВрдЪреА рдХреА рд▓рдЧрднрдЧ рдкреВрд░реА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ)ред рдПрдХ рд╢рдмреНрдж рдореЗрдВ, рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд▓рдВрдмрд╛ред
рдХрдард┐рди рдирд┐рд░реНрдгрдп
рдЕрдм рдЖрдЗрдП рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ - рдРрд╕реЗ рд╡рд░реНрдЧ рдХреЛ рдХреИрд╕реЗ рддреНрд╡рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╣рдорд╛рд░реЗ рд╕рд╛рде рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреИрд╢_RU рдХреЛ рдЕрджреНрдпрддрд┐рдд рд░рдЦрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ - рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХрд░рдирд╛, рдлрд┐рд░ рдПрдХ рдЖрдЗрдЯрдо рдХреЛ рд╣рдЯрд╛рдирд╛ рдФрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рдорд╣рдВрдЧрд╛ рдСрдкрд░реЗрд╢рди рд╣реИред рдпрд╣рд╛рдБ, рдПрдХ
рджреНрд╡рд┐рджрд┐рд╢ рд▓рд┐рдВрдХреНрдб рд╕реВрдЪреА рдЬреИрд╕реА рдЪреАрдЬрд╝ рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрдПрдЧреА - рдпрд╣ рд╣рдореЗрдВ "рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧ - рдЕрдВрдд рдореЗрдВ" рд╕рдорд░реНрдерди рдкреНрд░рджрд╛рди рдХрд░реЗрдЧреА, рд▓реЗрдХрд┐рди рдареАрдХ рд╣реИ, WeakValueDictionary () рдЗрд╕ рд╕реВрдЪреА рдкрд░ рддреНрд╡рд░рд┐рдд рдЦреЛрдЬ рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░реЗрдЧреА (рд╢рдмреНрджрдХреЛрд╖ рдЦреЛрдЬ рд░реИрдЦрд┐рдХ рддрд╛рд▓рдореЗрд▓ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬрд╝ рд╣реИ, рдЪреВрдВрдХрд┐ рдкрд╛рдпрдерди рдХреЗ рдЕрдВрджрд░ рд╕реЗ рд╣реИред рд╢рдмреНрджрдХреЛрд╢ рдХреБрдВрдЬреА рд╣реИрд╢ рджреНрд╡рд╛рд░рд╛ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдкреЗрдбрд╝реЛрдВ рдХреА рддрд░рд╣ рдХреБрдЫ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ
(рдпрд╣рд╛рдВ рдУрд╕реНрдЯрд╛рдк рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ - рдореИрдВ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рд╕реНрд░реЛрдд рдХреЛ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХреЗрд╡рд▓ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рд╢рдмреНрджрдХреЛрд╢ рдЦреЛрдЬ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ)рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ - рдПрдХ рд╕реВрдЪреА рдЖрдЗрдЯрдо, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд╕рдВрдЧреНрд░рд╣реАрдд рдбреЗрдЯрд╛ рдХреЛ рд▓рдкреЗрдЯреЗрдВрдЧреЗ:
class Element(object): __slots__ = ['prev', 'next', 'value', '__init__', '__weakref__'] def __init__(self, value): self.prev, self.next, self.value = None, None, value
рдпрд╣рд╛рдВ рдЗрд╕реЗ __slots__ рдХреЗ рд░реВрдк рдореЗрдВ рдРрд╕реА рдЪреАрдЬрд╝ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдПрдХ рд╣реА рд╡рд░реНрдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕реНрдореГрддрд┐ рдФрд░ рдереЛрдбрд╝рд╛ - рдмрд╣реБрдд рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдмрд┐рдирд╛ (
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ рдЗрд╕реЗ рдХреНрдпрд╛ рдЦрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
рдЕрдм рдПрдХ рдХреИрд╢ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВ (рд╣рдо "рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП" рдХреЗ рдЕрдВрджрд░ рддрддреНрд╡ рд╡рд░реНрдЧ рдХреЛ рдЪрд┐рдкрдХрд╛рдПрдБрдЧреЗ):
import weakref class FastCache: class Element(object): __slots__ = ['prev', 'next', 'value', '__init__', '__weakref__'] def __init__(self, value): self.prev, self.next, self.value = None, None, value def __init__(self, maxCount): self.dict = weakref.WeakValueDictionary() self.head = None self.tail = None self.count = 0 self.maxCount = maxCount def _removeElement(self, element): prev, next = element.prev, element.next if prev: assert prev.next == element prev.next = next elif self.head == element: self.head = next if next: assert next.prev == element next.prev = prev elif self.tail == element: self.tail = prev element.prev, element.next = None, None assert self.count >= 1 self.count -= 1 def _appendElement(self, element): if element is None: return element.prev, element.next = self.tail, None if self.head is None: self.head = element if self.tail is not None: self.tail.next = element self.tail = element self.count += 1 def get(self, key, *arg): element = self.dict.get(key, None) if element: self._removeElement(element) self._appendElement(element) return element.value elif len(*arg): return arg[0] else: raise KeyError("'%s' is not found in the dictionary", str(key)) def __len__(self): return len(self.dict) def __getitem__(self, key): element = self.dict[key]
рдпрд╣рд╛рдВ рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╣рддреНрд╡рдкреВрд░реНрдг / рджрд┐рд▓рдЪрд╕реНрдк рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗ рд╕рдХрддреЗ рд╣реИрдВ:
- рдкреНрд░рд╛рдкреНрдд () рд╡рд┐рдзрд┐ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдпрджрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдХреБрдВрдЬреА рдЧрд╛рдпрдм рд╣реИ, рддреЛ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИ (рдХреИрд╢ [рдХреБрдВрдЬреА] рдХреЗ рд╕рдорд╛рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ), рдФрд░ рдпрджрд┐ рдХреЛрдИ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╣реИ, рддреЛ рдЙрд╕реЗ рд▓реМрдЯрд╛рддрд╛ рд╣реИ
- __del__ рд╡рд┐рдзрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЕрдиреНрдпрдерд╛ рд╣рдо рдкреВрд░реЗ рдХреИрд╢ рдХрд╛ рдПрдХ рд░рд┐рд╕рд╛рд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ (рдпрд╛ рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) - рдЖрдЦрд┐рд░рдХрд╛рд░, рд╕реВрдЪреА рдХреЗ рд╕рднреА рддрддреНрд╡ рдПрдХ-рджреВрд╕рд░реЗ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЙрдирдХреЗ рд▓рд┐рдВрдХ рдХрд╛рдЙрдВрдЯрд░ рдмрд┐рдирд╛ рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рдХрднреА рднреА рд░реАрд╕реЗрдЯ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ; рд╡реИрд╕реЗ, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдмрд┐рд▓реНрдЯ-рдЗрди (рдХрдо рд╕реЗ рдХрдо 2.6) рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд▓рд┐рдВрдХ рдЪрдХреНрд░ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрддрд╛ рд╣реИ, рдЗрд╕ рд╕реВрдЪреА рдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
- рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдЖрдк рд╣рддреНрдпрд╛рд░реЛрдВ рдХреЛ рдлреЗрдВрдХрдХрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдереЛрдбрд╝рд╛ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ
рдХреЗ рдЙрдкрдпреЛрдЧ
рдпрд╣ рдкрд┐рдЫрд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдиреБрд░реВрдк рд╣реИ (рдФрд░ рдЕрдВрджрд░ рддрд░реНрдХ рд╕рдорд╛рди рд╣реИ, рдпрд╣ рди рдХреЗрд╡рд▓ рдкрд╛рдпрдерди рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рд╕реВрдЪреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐
рд╢рддрд░рдВрдЬ рдФрд░ рдХрд╡рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╕рдХреА рджреНрд╡рд┐рджрд┐рд╢ рд╕реВрдЪреА
рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ)ред
рдЕрдЪреНрдЫреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рдиред
рдзрдиреНрдпрд╡рд╛рдж рдЯрд┐рдк рдХреЗ рд▓рд┐рдП
seriyPS !
рдПрдХ рдФрд░ рд╕рдорд╛рдзрд╛рди рд╕рд╛рдордиреЗ рдЖрдпрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рд╣реА рд╕рд░рд▓ рд╣реИ (рдпрджрд┐ рд╕рд░рд▓ рднреА рдирд╣реАрдВ рд╣реИ) рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд▓рдЧрднрдЧ рдЙрддрдиреА рд╣реА рддреЗрдЬреА рд╕реЗ рдЬрдЯрд┐рд▓ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
from collections import OrderedDict class ODCache(OrderedDict): def __init__(self, cacheSize): self.cacheSize = cacheSize OrderedDict.__init__(self) def __getitem__(self, key): value = OrderedDict.__getitem__(self, key) return self._touchCache(key, value) def __setitem__(self, key, value): self._touchCache(key, value) def _touchCache(self, key, value): try: OrderedDict.__delitem__(self, key) except KeyError: pass OrderedDict.__setitem__(self, key, value) toDel = len(self) - self.cacheSize if toDel > 0: for k in OrderedDict.keys(self)[:toDel]: OrderedDict.__delitem__(self, k) return value
рдПрдХ рдФрд░ рд╕рдорд╛рдзрд╛рди рдЕрдЪреНрдЫрд╛ рдкреНрд░рджрд░реНрд╢рди рд╣реИред
рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рд╕рдорд╛рдзрд╛рди (рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЧрддрд┐ рдореЗрдВ рдЕрдЧреНрд░рдгреА рд╣реИ), рдзрдиреНрдпрд╡рд╛рдж
tbd :
class ListDictBasedCache(object): __slots__ = ['__key2value', '__maxCount', '__weights'] def __init__(self, maxCount): self.__maxCount = maxCount self.__key2value = {}
рддреБрд▓рдирд╛
рдЖрд░реЛрдк рдПрдХ рдмрд╛рдд рд╣реИ, рдФрд░ рдирд┐рд╖реНрдкрдХреНрд╖ рдЖрдВрдХрдбрд╝реЗ рджреВрд╕рд░реЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╢рдмреНрдж рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд╣рддрд╛, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд - рд╣рдо рдЗрди рд╡рд░реНрдЧреЛрдВ рдХреЛ рдорд╛рдкреЗрдВрдЧреЗ!
рдпрд╣рд╛рдВ рдкрд╛рдЗрдерди рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛
рдЯрд╛рдЗрдордЯрд╛рдЗрдо рдореЙрдбреНрдпреВрд▓ рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИ:
class StubClass: def __init__(self, something): self.something = something def testCache(cacheClass, cacheSize, repeat): d = cacheClass(cacheSize) for i in xrange(repeat * cacheSize): d[i] = StubClass(i) import random class testCacheReadGen: def __init__(self, cacheClass, cacheSize): d = cacheClass(cacheSize) for i in xrange(cacheSize): d[i] = StubClass(i) self.d = d self.s = cacheSize def __call__(self, repeat): cacheSize, d = self.s, self.d for i in xrange(cacheSize * repeat): tmp = d[random.randint(0, cacheSize-1)] def minMaxAvg(lst): return min(lst), max(lst), 1.0 * sum(lst) / len(lst) import timeit def testAllCaches(classes, cacheSize, repeats): templ = '%s: min %.5f, max %.5f, avg %.5f' genmsg = lambda cls, res: templ % ((cls.__name__.ljust(20),) + tuple(minMaxAvg(res))) for cls in classes: t = timeit.Timer(lambda: testCache(cls, cacheSize, repeats[0])) print genmsg(cls, t.repeat(*repeats[1:])) def testAllCachesRead(classes, cacheSize, repeats): templ = '%s: min %.5f, max %.5f, avg %.5f' genmsg = lambda cls, res: templ % ((cls.__name__.ljust(20),) + tuple(minMaxAvg(res))) for cls in classes: tst = testCacheReadGen(cls, cacheSize) t = timeit.Timer(lambda: tst(repeats[0])) print genmsg(cls, t.repeat(*repeats[1:])) if __name__ == '__main__': print 'write' testAllCaches((SimpleCache, FastCache, ODCache, ListDictBasedCache), 100, (100, 3, 3)) print 'read' testAllCachesRead((SimpleCache, FastCache, ODCache, ListDictBasedCache), 100, (100, 3, 3))
рдореЗрд░реА рдорд╢реАрди рдкрд░ рд▓реЙрдиреНрдЪ рдХреЗ рдкрд░рд┐рдгрд╛рдо (Intel Core i5 2540M 2.6GHz, Win7 64-bit, ActivePython 2.7.2 x64-bit):
рд▓рд┐рдЦрдиреЗ
рд╕рд┐рдВрдкрд▓рдЪреЗрдЪ: рдиреНрдпреВрдирддрдо 9.36119, рдЕрдзрд┐рдХрддрдо 9.49077, рдФрд╕рдд 9.42536
FastCache: рдиреНрдпреВрдирддрдо 0.39449, рдЕрдзрд┐рдХрддрдо 0.41835, рдФрд╕рдд 0.40880
ODCache: рдиреНрдпреВрдирддрдо 0.79536, рдЕрдзрд┐рдХрддрдо 0.82727, рдФрд╕рдд 0.81482
ListDictBasedCache: рдиреНрдпреВрдирддрдо 0.25135, рдЕрдзрд┐рдХрддрдо 0.27334, рдФрд╕рдд 0.26000
рдкрдврд╝рдирд╛
рд╕рд┐рдВрдкрд▓ рдХреИрдЪреЗ: рдиреНрдпреВрдирддрдо 9.61617, рдЕрдзрд┐рдХрддрдо 9.73143, 9.66337
FastCache: рдиреНрдпреВрдирддрдо 0.19294, рдЕрдзрд┐рдХрддрдо 0.21941, 0.20552 рдФрд╕рдд
ODCache: рдиреНрдпреВрдирддрдо 0.22270, рдЕрдзрд┐рдХрддрдо 0.25816, рдФрд╕рдд 0.23911
ListDictBasedCache: рдиреНрдпреВрдирддрдо 0.16475, рдЕрдзрд┐рдХрддрдо 0.17725, рдФрд╕рдд 0.16911
рд╕рд░рд▓ рдФрд░ рдЬрдЯрд┐рд▓ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдХрд╛рдлреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ - рд▓рдЧрднрдЧ 20 рдмрд╛рд░! рдСрд░реНрдбрд░рдбреАрдбрд┐рдХреНрдЯ рдкрд░ рдирд┐рд░реНрдгрдп рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкрд┐рдЫрдбрд╝ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдереЛрдбрд╝рд╛ рд╣реАред рдЖрдЧреЗ рдХреЗ рдирд┐рд╖реНрдХрд░реНрд╖реЛрдВ рдХреЗ рд▓рд┐рдП, рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдорд╛рдк рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬреЛ рдХреИрд╢ рдХрд╛рд░реНрдп рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВ - рд╕реВрдЪрдирд╛ рдХреЗ рдордирдорд╛рдиреЗ рдЯреБрдХрдбрд╝реЛрдВ рддрдХ рддреНрд╡рд░рд┐рдд рдкрд╣реБрдВрдЪ, рдФрд░ рдХреБрдЫ рд░реИрдЦрд┐рдХ рдПрдХ рдирд╣реАрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╕реНрдореГрддрд┐ рдХреА рдЦрдкрдд рдХреЗ рд▓рд┐рдП - рдкрд┐рдЫрд▓реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдореБрдЦреНрдп рдЕрдиреБрднрд╛рдЧ рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдПрдВ рдФрд░ рдХрд╛рд░реНрдп рдкреНрд░рдмрдВрдзрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рдпрдерди рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рдХреА рд╕реНрдореГрддрд┐ рдЙрдкрдпреЛрдЧ рджреЗрдЦреЗрдВ:
if __name__ == '__main__': import time print 'measure me - no cache' try: while True: time.sleep(10) except:
рдорд╛рдк рдкрд░рд┐рдгрд╛рдо рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╣реИрдВ:
рдХреИрд╢ рдХреНрд▓рд╛рд╕ | рдХреИрд╢ рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ | рдХреИрд╢ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж | рдХреИрд╢ рдХреА рдЦрдкрдд |
SimpleCache | 4228K | 4768K | 540K |
FastCache | 4232K | 4636K | 404K |
ODCache | 4496K | 4936K | 440K |
ListDictBasedCache | 4500K | 4880K | 380K |
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рдЬрдЯрд┐рд▓ рд╕рдорд╛рдзрд╛рди рди рдХреЗрд╡рд▓ рддреЗрдЬреА рд╕реЗ (~ 20 рдЧреБрдирд╛) рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝реА рдХрдо рдореЗрдореЛрд░реА рднреА рдЦрдкрдд рдХрд░рддрд╛ рд╣реИред
рдЙрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдореЗрдВ, рдЬреЛ рдореИрдВрдиреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреИрд╢ рдХреЛ рдмрдирд╛рдХрд░ рд╣рд▓ рдХрд┐рдпрд╛ рдерд╛, рдЗрд╕рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдореБрдЭреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдордп рдХреЛ 90 рд╕реЗрдХрдВрдб рд╕реЗ рдШрдЯрд╛рдХрд░ рд▓рдЧрднрдЧ 70 (рдЕрдзрд┐рдХ рд╕рдШрди рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдФрд░ рдкреБрдирд░реНрд▓реЗрдЦрди рд▓рдЧрднрдЧ рд╕рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЬрдирд░реЗрд╢рди рд▓реЙрдЬрд┐рдХ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЧрдИ), рдлрд┐рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдордп рдХреЛ 30 рд╕реЗрдХрдВрдб рддрдХ рд▓рд╛рдиреЗ рдореЗрдВ рдорджрдж рдХреА, рд▓реЗрдХрд┐рди рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдерд╛ рдПрдХ рдФрд░ рдХрд╣рд╛рдиреА)ред