ππΎ Π’Π²ΠΎΠΉ Python-ΠΊΠΎΠ΄ ΠΆΡΠ΅Ρ ΠΏΠ°ΠΌΡΡΡ? ΠΠΎΡ 11 ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΡΡΠΎ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ
ΠΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±ΠΈΡΡΡΡ Π²ΡΡΠΎΠΊΠΎΠΉ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΈ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΡΠ΅ΠΌΠΎΡΡΠΈ, Π΅ΡΠ»ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΡΡ ΠΏΠ°ΠΌΡΡΡ. Π Π°ΡΡΠΊΠ°ΠΆΠ΅ΠΌ, ΠΊΠ°ΠΊ ΡΡΠΎ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ.
ΠΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΡΡ β ΠΊΠ»ΡΡ ΠΊ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΈ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. Π ΡΠ°ΡΠΏΠΎΡΡΠΆΠ΅Π½ΠΈΠΈ Python-ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² Π΅ΡΡΡ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΡ, ΡΡΠΎΡΠΎΠ½Π½ΠΈΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΠΈ ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠΌΠΎΠ³Π°ΡΡ ΡΠΎΠΊΡΠ°ΡΠΈΡΡ ΡΠ°ΡΡ ΠΎΠ΄ ΠΏΠ°ΠΌΡΡΠΈ.
ΠΠ±ΡΠ΅ΠΊΡΠ½ΡΠΉ ΠΏΡΠ»
ΠΠ±ΡΠ΅ΠΊΡΠ½ΡΠΉ ΠΏΡΠ» β ΡΡΡΠ°ΡΠ΅Π³ΠΈΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠ°ΠΌΡΡΠΈ ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ:
- ΠΠΌΠ΅ΡΡΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π±Π΅ΡΠ΅Ρ Π΅Π³ΠΎ ΠΈΠ· ΠΏΡΠ»Π°.
- ΠΠΎΠ²ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ Π² ΠΏΡΠ»Π΅ Π½Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ².
- ΠΠΎΡΠ»Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ Π² ΠΏΡΠ», Π° Π½Π΅ ΡΠ½ΠΈΡΡΠΎΠΆΠ°Π΅ΡΡΡ.
ΠΡΠ»ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΈ ΡΠ΄Π°Π»ΡΠ΅Ρ ΡΠ΅ΡΡΡΡΠΎΠ΅ΠΌΠΊΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΡΠΎ ΡΡΠΎΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ:
- Π‘Π½ΠΈΠ·ΠΈΡΡ Π·Π°ΡΡΠ°ΡΡ Π½Π° Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ.
- Π£ΠΌΠ΅Π½ΡΡΠΈΡΡ Π½Π°Π³ΡΡΠ·ΠΊΡ Π½Π° ΡΠ±ΠΎΡΡΠΈΠΊ ΠΌΡΡΠΎΡΠ°.
- ΠΠΎΠ²ΡΡΠΈΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΊΠΎΠ΄Π°, ΡΠ°Π±ΠΎΡΠ°ΡΡΠ΅Π³ΠΎ Ρ Π·Π°ΡΡΠ°ΡΠ½ΡΠΌΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.
ΠΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΡΠΎΡΡΠ΅ΠΉΡΠ΅Π³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠ»Π°:
class ObjectPool: def __init__(self, create_func): self.create_func = create_func self.pool = [] def acquire(self): """ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΈΠ· ΠΏΡΠ»Π° ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π½ΠΎΠ²ΡΠΉ""" if self.pool: obj = self.pool.pop() print("ΠΠ·ΡΠ»ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΈΠ· ΠΏΡΠ»Π°") return obj print("Π‘ΠΎΠ·Π΄Π°Π½ Π½ΠΎΠ²ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ") return self.create_func() def release(self, obj): """ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π² ΠΏΡΠ»""" self.pool.append(obj) print("ΠΠ±ΡΠ΅ΠΊΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ Π² ΠΏΡΠ»") def create_expensive_object(): print("Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π½ΠΎΠ²ΡΠΉ ΡΠ΅ΡΡΡΡΠΎΠ΅ΠΌΠΊΠΈΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ") return [0] * 1000000 pool = ObjectPool(create_expensive_object) obj1 = pool.acquire() pool.release(obj1) """ΠΠ΅ΡΠ΅ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠ½ΠΎΠ²Π° (ΠΏΠ΅ΡΠ΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ obj1)""" obj2 = pool.acquire()
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ:
Π‘ΠΎΠ·Π΄Π°Π½ Π½ΠΎΠ²ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π½ΠΎΠ²ΡΠΉ ΡΠ΅ΡΡΡΡΠΎΠ΅ΠΌΠΊΠΈΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΠ±ΡΠ΅ΠΊΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ Π² ΠΏΡΠ» ΠΠ·ΡΠ»ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΈΠ· ΠΏΡΠ»Π°
Π‘Π»Π°Π±ΡΠ΅ ΡΡΡΠ»ΠΊΠΈ
Π Python ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠ±ΠΎΡΡΠΈΠΊ ΠΌΡΡΠΎΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ΄Π°Π»ΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΠΊΠΎΠ³Π΄Π° Π½Π° Π½ΠΈΡ Π½Π΅ ΠΎΡΡΠ°Π»ΠΎΡΡ ΡΡΡΠ»ΠΎΠΊ. ΠΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΡΡΡΠ»ΠΊΡ Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡ, Π½Π΅ ΠΌΠ΅ΡΠ°Ρ Π΅Π³ΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΌΡ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ. Π‘Π»Π°Π±ΡΠ΅ ΡΡΡΠ»ΠΊΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΡΡΡΠ»Π°ΡΡΡΡ Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡ Π±Π΅Π· ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΡ Π΅Π³ΠΎ ΡΡΠ΅ΡΡΠΈΠΊΠ° ΡΡΡΠ»ΠΎΠΊ, ΠΈ ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΌ ΠΏΠΎΠΌΠΎΠ³Π°ΡΡ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΠΈΠ·Π±ΡΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ β ΠΎΠ±ΡΠ΅ΠΊΡΡ Π±ΡΠ΄ΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ΄Π°Π»ΡΡΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ Π½ΡΠΆΠ½Ρ. ΠΡΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ:
- ΠΠ»Ρ ΠΊΡΡΠ΅ΠΉ β ΡΡΠΎΠ±Ρ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ΄Π°Π»ΡΠ»ΠΈΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ Π½ΡΠΆΠ½Ρ.
- ΠΠ»Ρ ΠΈΠ·Π±Π΅ΠΆΠ°Π½ΠΈΡ ΡΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠΈΡ ΡΡΡΠ»ΠΎΠΊ β Π΅ΡΠ»ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ A ΡΡΡΠ»Π°Π΅ΡΡΡ Π½Π° B, Π° B Π½Π° A, ΠΎΠ±ΡΡΠ½ΡΠΉ ΡΠ±ΠΎΡΡΠΈΠΊ ΠΌΡΡΠΎΡΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΈΡ Π½Π΅ ΡΠ΄Π°Π»ΠΈΡΡ.
ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ»Π°Π±ΡΡ ΡΡΡΠ»ΠΎΠΊ:
import weakref class ExpensiveObject: def __init__(self, value): self.value = value def on_delete(ref): print("ΠΠ±ΡΠ΅ΠΊΡ ΡΠ΄Π°Π»Π΅Π½") obj = ExpensiveObject(555_555_555) weak_ref = weakref.ref(obj, on_delete) del obj print(weak_ref())
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ:
ΠΠ±ΡΠ΅ΠΊΡ ΡΠ΄Π°Π»Π΅Π½ None
Π‘Π»ΠΎΡΡ
Π Python ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠ»Π°ΡΡΠ° ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠ»ΠΎΠ²Π°ΡΡ __dict__ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠ²ΠΎΠΈΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ². ΠΡΠΎ ΡΠ΄ΠΎΠ±Π½ΠΎ, Π½ΠΎ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ ΡΡΠ°Π²Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΎΠ±ΡΠ΅ΠΌ ΠΏΠ°ΠΌΡΡΠΈ, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π΅ΡΠ»ΠΈ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ².
ΠΡΠ»ΠΈ ΠΌΡ Π·Π°ΡΠ°Π½Π΅Π΅ Π·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ Π°ΡΡΠΈΠ±ΡΡΡ Π±ΡΠ΄ΡΡ Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ __slots__, ΡΡΠΎΠ±Ρ ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡΡ ΠΏΠ°ΠΌΡΡΡ. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Python ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ°ΡΡΠΈΠ² ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π²ΠΌΠ΅ΡΡΠΎ ΡΠ»ΠΎΠ²Π°ΡΡ. Π ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π² RegularClass
Π²ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ Ρ
ΡΠ°Π½ΡΡ Π°ΡΡΠΈΠ±ΡΡΡ Π² ΡΠ»ΠΎΠ²Π°ΡΠ΅, ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ ΠΈΡ
Π³ΠΈΠ±ΠΊΠΈΠΌΠΈ, Π½ΠΎ Π·Π°ΡΡΠ°ΡΠ½ΡΠΌΠΈ ΠΏΠΎ ΠΏΠ°ΠΌΡΡΠΈ, Π° SlottedClass
Π²ΠΌΠ΅ΡΡΠΎ ΡΠ»ΠΎΠ²Π°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² Π΄Π»Ρ ΡΠ½ΠΈΠΆΠ΅Π½ΠΈΡ ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ:
class RegularClass: def __init__(self, x, y): self.x = x self.y = y class SlottedClass: __slots__ = ['x', 'y'] def __init__(self, x, y): self.x = x self.y = y import sys regular = RegularClass(1, 2) slotted = SlottedClass(1, 2) """Π Π°Π·Π½ΠΈΡΠ° Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ ΠΈ Π²Π΅ΡΡΠΈΠΈ Python""" print(sys.getsizeof(regular)) print(sys.getsizeof(slotted))
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ:
56 48
ΠΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»Π° Π² ΠΏΠ°ΠΌΡΡΡ
ΠΠ°Π³ΡΡΠ·ΠΊΠ° ΠΎΡΠ΅Π½Ρ Π±ΠΎΠ»ΡΡΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² Π² ΠΏΠ°ΠΌΡΡΡ ΠΌΠΎΠΆΠ΅Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π΅ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠΉ ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ. Π Π΅ΡΠΈΡΡ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΡΠ΅Ρ Π½ΠΈΠΊΠ° ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² Π² ΠΏΠ°ΠΌΡΡΡ β ΠΎΠ½Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΡΠ°ΠΉΠ»ΠΎΠΌ, ΠΊΠ°ΠΊ Ρ ΠΎΠ±ΡΡΠ½ΡΠΌ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠΌ, Π±Π΅Π· Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π·Π°Π³ΡΡΠΆΠ°ΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΡΡΡΠΎ ΡΠΈΡΠ°ΡΡ ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ Π² ΡΠ°ΠΉΠ», ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Ρ ΡΠΎΠ»ΡΠΊΠΎ Π½ΡΠΆΠ½ΡΠ΅ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΡ. Python ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΌΠΎΠ΄ΡΠ»Ρ mmap, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡΡ ΡΠ°ΠΉΠ» Π² ΠΏΠ°ΠΌΡΡΡ ΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π½ΠΈΠΌ, ΠΊΠ°ΠΊ Ρ Π±Π°ΠΉΡΠΎΠ²ΡΠΌ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠΌ:
import mmap with open('large_file.bin', 'rb') as f: mm = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) # Π§ΠΈΡΠ°Π΅ΠΌ 100 Π±Π°ΠΉΡ, Π½Π°ΡΠΈΠ½Π°Ρ Ρ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ 1000 data = mm[1000:1100] mm.close() # ΠΠ°ΠΊΡΡΠ²Π°Π΅ΠΌ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅
ΠΠΎΠ΄ΡΠ»Ρ mmap ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΠΏΠΎΠ»Π΅Π·Π΅Π½:
- ΠΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΠΎΠ³ΡΠΎΠΌΠ½ΡΠΌΠΈ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡΡΡ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΡΡ ΠΏΠ°ΠΌΡΡΡ.
- ΠΠ»Ρ Π±ΡΡΡΡΠΎΠ³ΠΎ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ³ΠΎ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π΄Π°Π½Π½ΡΠΌ Π² ΡΠ°ΠΉΠ»Π΅ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π±ΠΎΠ»ΡΡΠΈΡ Π»ΠΎΠ³ΠΎΠ² ΠΈΠ»ΠΈ Π±ΠΈΠ½Π°ΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ ).
- ΠΡΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡΠ°ΡΠ½ΠΎΠΌ ΡΡΠ΅Π½ΠΈΠΈ ΡΠ°ΡΡΠ΅ΠΉ ΡΠ°ΠΉΠ»Π° β mmap ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΠΊ ΡΠ°ΠΉΠ»Ρ, ΠΊΠ°ΠΊ ΠΊ ΠΌΠ°ΡΡΠΈΠ²Ρ, Π±Π΅Π· Π»ΠΈΡΠ½ΠΈΡ Π΄ΠΈΡΠΊΠΎΠ²ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ.
Π’ΠΎΡΠ½ΠΎΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΌΠ° ΠΏΠ°ΠΌΡΡΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ
ΠΡΠ»ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠ°ΠΌΡΡΠΈ, Π²Π°ΠΆΠ½ΠΎ Π²ΡΡΡΠ½ΠΈΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π² ΡΡΠΎΠΌ Π·Π°Π΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°Π½Ρ. ΠΠ΅ΡΠΎΠ΄ sys.getsizeof() ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ·Π½Π°ΡΡ ΡΠ°Π·ΠΌΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, Π½ΠΎ Π½Π΅ ΡΡΠΈΡΡΠ²Π°Π΅Ρ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ ΡΡΡΡΠΊΡΡΡΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Ρ ΡΠΏΠΈΡΠΊΠ° sys.getsizeof(my_list) ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π΅Π³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, Π½ΠΎ Π½Π΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π²Π½ΡΡΡΠΈ. ΠΠ»Ρ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ Π»ΡΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΠ΄Π²ΠΈΠ½ΡΡΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, memory_profiler. ΠΡΠΎΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΠ·ΠΌΠ΅ΡΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ ΠΏΠΎΡΡΡΠΎΡΠ½ΠΎ, Π²ΡΡΠ²Π»ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½ΡΠ΅ ΠΌΠ΅ΡΡΠ° Π² ΠΊΠΎΠ΄Π΅:
from memory_profiler import profile @profile def memory_hungry_function(): list_of_lists = [[i] * 1000 for i in range(1000)] return sum(sum(sublist) for sublist in list_of_lists) memory_hungry_function()
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ:
Line # Mem usage Increment Occurrences Line Contents ============================================================= 3 25.7 MiB 25.7 MiB 1 @profile 4 def memory_hungry_function(): 5 33.4 MiB 7.7 MiB 1003 list_of_lists = [[i] * 1000 for i in range(1000)] 6 33.4 MiB 0.0 MiB 2003 return sum(sum(sublist) for sublist in list_of_lists)
ΠΡΡΠ΅ΠΊΡΠΈΠ²Π½Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π±ΠΎΠ»ΡΡΠΈΡ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΉ
ΠΠ±ΡΡΠ½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ Π·Π°Π³ΡΡΠΆΠ°Π΅Ρ Π²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΡΡΠ°Π·Ρ, ΠΈ Π΅ΡΠ»ΠΈ ΡΠ°ΠΉΠ» ΠΎΡΠ΅Π½Ρ Π±ΠΎΠ»ΡΡΠΎΠΉ, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ Π·Π°Π½ΡΡΡ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠ°ΠΌΡΡΠΈ:
def load_all_lines(filename): with open(filename, 'r') as f: return [process_line(line) for line in f]
ΠΠ΅Π½Π΅ΡΠ°ΡΠΎΡ ΠΈ yield ΡΠ΅ΡΠ°ΡΡ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ β ΡΠ°ΠΉΠ» ΠΌΠΎΠΆΠ½ΠΎ ΡΠΈΡΠ°ΡΡ ΠΏΠΎΡΡΡΠΎΡΠ½ΠΎ, Π½Π΅ Π·Π°Π³ΡΡΠΆΠ°Ρ Π²ΡΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΠ΅Π»ΠΈΠΊΠΎΠΌ:
def process_large_dataset(filename): with open(filename, 'r') as f: for line in f: yield process_line(line) for result in process_large_dataset('large_file.txt'): print(result)
ΠΠ΅Π½Π΅ΡΠ°ΡΠΎΡΡ ΡΡΠΎΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠΈ:
- ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ Π±ΠΎΠ»ΡΡΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² (Π»ΠΎΠ³ΠΎΠ², CSV, JSON).
- Π Π°Π±ΠΎΡΠ΅ Ρ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ Π΄Π°Π½Π½ΡΡ (Π²Π΅Π±-ΡΠΊΡΠ°ΠΏΠΈΠ½Π³, ΡΠ°Π±ΠΎΡΠ° Ρ API).
- ΠΡΠΈ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠ΅ΠΉ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΡΠ΅ ΡΡΠ΄Ρ ΡΠΈΡΠ΅Π»).
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΏΠΎΡΠ»ΠΎΠ²Π½ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΎΠ±ΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°:
def word_count_generator(file_path): with open(file_path, 'r') as file: for line in file: for word in line.split(): yield word word_counts = {} for word in word_count_generator('large_text_file.txt'): word_counts[word] = word_counts.get(word, 0) + 1 print(word_counts)
ΠΠ°ΡΡΠΎΠΌΠ½ΡΠ΅ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ
ΠΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΠΎΡΠ΅Π½Ρ Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ, ΠΎΠ±ΡΡΠ½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ list ΠΌΠΎΠΆΠ΅Ρ Π·Π°Π½ΡΡΡ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠ°ΠΌΡΡΠΈ. Π ΡΠ°ΠΊΠΈΡ ΡΠ»ΡΡΠ°ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Ρ ΡΠ°Π½ΠΈΡΡ ΡΠ°ΡΡΡ Π΄Π°Π½Π½ΡΡ Π½Π° Π΄ΠΈΡΠΊΠ΅, Π° Π½Π΅ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ. Π‘ ΡΡΠΎΠΉ ΡΠ΅Π»ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠΎΡ ΡΠ°Π½ΡΠ΅Ρ Π΄Π°Π½Π½ΡΠ΅ Π½Π° Π΄ΠΈΡΠΊ, Π΅ΡΠ»ΠΈ ΠΎΠ½ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π±ΠΎΠ»ΡΡΠΈΠΌ. Π ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ DiskBackedList β ΡΡΠΎ Π³ΠΈΠ±ΡΠΈΠ΄ ΡΠΏΠΈΡΠΊΠ° ΠΈ ΡΠ°ΠΉΠ»Π°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΠΎΠ³ΡΠΎΠΌΠ½ΡΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ Π±Π΅Π· ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ:
- Π₯ΡΠ°Π½ΠΈΡ Π΄Π°Π½Π½ΡΠ΅ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ
self.memory_list
. - ΠΡΠ»ΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΌΠ½ΠΎΠ³ΠΎ
max_memory_items
, ΠΎΠ½ ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅Ρ ΠΈΡ Π² ΡΠ°ΠΉΠ». - ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅Π±ΠΈΡΠ°ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ, Π·Π°Π³ΡΡΠΆΠ°Ρ ΠΈΡ Ρ Π΄ΠΈΡΠΊΠ° ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ.
import pickle class DiskBackedList: def __init__(self, max_memory_items=1000): self.max_memory_items = max_memory_items # ΠΠΈΠΌΠΈΡ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ Π² ΠΏΠ°ΠΌΡΡΠΈ self.memory_list = [] self.disk_file = 'temp_list.pkl' def append(self, item): """ΠΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π² ΡΠΏΠΈΡΠΎΠΊ, Π²ΡΠ³ΡΡΠΆΠ°Ρ Π½Π° Π΄ΠΈΡΠΊ ΠΏΡΠΈ ΠΏΡΠ΅Π²ΡΡΠ΅Π½ΠΈΠΈ Π»ΠΈΠΌΠΈΡΠ°""" self.memory_list.append(item) if len(self.memory_list) >= self.max_memory_items: self._write_to_disk() def _write_to_disk(self): """ΠΠ°ΠΏΠΈΡΡΠ²Π°Π΅Ρ ΡΠΏΠΈΡΠΎΠΊ Π½Π° Π΄ΠΈΡΠΊ ΠΈ ΠΎΡΠΈΡΠ°Π΅Ρ ΠΏΠ°ΠΌΡΡΡ""" with open(self.disk_file, 'ab') as f: # 'ab' = Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² ΡΠ°ΠΉΠ» (binary) pickle.dump(self.memory_list, f) self.memory_list.clear() # ΠΡΠΈΡΠ°Π΅ΠΌ ΡΠΏΠΈΡΠΎΠΊ ΠΈΠ· ΠΏΠ°ΠΌΡΡΠΈ def __iter__(self): """ΠΡΠ΅ΡΠΈΡΡΠ΅ΠΌ ΡΠ½Π°ΡΠ°Π»Π° ΠΏΠΎ ΠΏΠ°ΠΌΡΡΠΈ, Π·Π°ΡΠ΅ΠΌ ΠΏΠΎ ΡΠ°ΠΉΠ»Ρ""" yield from self.memory_list with open(self.disk_file, 'rb') as f: while True: try: yield from pickle.load(f) # Π§ΠΈΡΠ°Π΅ΠΌ ΡΠΎΡ ΡΠ°Π½Π΅Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ except EOFError: break # ΠΠΎΡΡΠΈΠ³Π»ΠΈ ΠΊΠΎΠ½ΡΠ° ΡΠ°ΠΉΠ»Π° def __del__(self): """Π£Π΄Π°Π»ΡΠ΅ΠΌ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ ΡΠ°ΠΉΠ» ΠΏΡΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ°""" import os if os.path.exists(self.disk_file): os.remove(self.disk_file)
ΠΡΡΠ΅ΠΊΡΠΈΠ²Π½Π°Ρ ΡΠ°Π±ΠΎΡΠ° Ρ Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ ΠΌΠ°ΡΡΠΈΠ²Π°ΠΌΠΈ NumPy
ΠΠ½Π°Π»ΠΈΡΠΈΠΊΠ°ΠΌ ΠΈ Π΄Π°ΡΠ°-ΡΠ°ΠΉΠ΅Π½ΡΠΈΡΡΠ°ΠΌ Π½Π΅ΡΠ΅Π΄ΠΊΠΎ ΡΠ»ΡΡΠ°Π΅ΡΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΠΌΠ°ΡΡΠΈΠ²Π°ΠΌΠΈ, Π·Π°Π½ΠΈΠΌΠ°ΡΡΠΈΠΌΠΈ ΡΠΎΠ»ΠΈΠ΄Π½ΡΡ ΡΠ°ΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ. Π Π΅ΡΠ΅Π½ΠΈΠ΅ β ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ np.memmap: ΠΎΠ½ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠΌ, ΠΊΠ°ΠΊ Π±ΡΠ΄ΡΠΎ ΠΎΠ½ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ (Π° Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Ρ ΡΠ°Π½ΠΈΡΡΡ Π½Π° Π΄ΠΈΡΠΊΠ΅). Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΠΌΠ°ΡΡΠΈΠ²Π°ΠΌΠΈ, ΡΠ°Π·ΠΌΠ΅Ρ ΠΊΠΎΡΠΎΡΡΡ ΠΏΡΠ΅Π²ΡΡΠ°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΌ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ:
import numpy as np # Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠ°ΡΡΠΈΠ²Π° Π² ΠΏΠ°ΠΌΡΡΠΈ shape = (10000, 10000) mm_array = np.memmap('mm_array.dat', dtype='float32', mode='w+', shape=shape) # ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΌΠ°ΡΡΠΈΠ², ΠΊΠ°ΠΊ Π΅ΡΠ»ΠΈ Π±Ρ ΠΎΠ½ Π±ΡΠ» Π² ΠΏΠ°ΠΌΡΡΠΈ mm_array[0, 0] = 1.0 mm_array[9999, 9999] = 100.0 # ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΡΡ Π½Π° Π΄ΠΈΡΠΊ del mm_array # ΠΠ°ΠΊΡΡΠ²Π°Π΅ΠΌ ΡΠ°ΠΉΠ»
ΠΠ°ΡΡΠΎΠΌΠ½ΡΠΉ ΠΊΡΡ Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ΠΌ ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΡ Π΄Π°Π½Π½ΡΡ
Π Π΄ΠΎΠ»Π³ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΡ ΡΠ΅ΡΠ²Π΅ΡΠ½ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ Ρ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π΄Π°Π½Π½ΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΡΠΊΠΎΡΡΠ΅Ρ ΡΠ°Π±ΠΎΡΡ ΠΈ ΡΠΌΠ΅Π½ΡΡΠ°Π΅Ρ Π½Π°Π³ΡΡΠ·ΠΊΡ Π½Π° Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ . Π§ΡΠΎΠ±Ρ Π½Π΅ ΡΡΠΎΠ»ΠΊΠ½ΡΡΡΡΡ Ρ ΡΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ, ΡΡΠΎΠΈΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΠΉ ΠΊΡΡ Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΡΠΌ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ ΠΆΠΈΠ·Π½ΠΈ Π΄Π°Π½Π½ΡΡ . Π ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ TimedCache:
- Π₯ΡΠ°Π½ΠΈΡ Π΄Π°Π½Π½ΡΠ΅ Π² ΡΠ»ΠΎΠ²Π°ΡΠ΅, ΡΡΠΎΠ±Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡ Π±ΡΡΡΡΡΠΉ Π΄ΠΎΡΡΡΠΏ.
- ΠΠ°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ Π²ΡΠ΅ΠΌΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°.
- Π£Π΄Π°Π»ΡΠ΅Ρ ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠΈ.
import time class TimedCache: def __init__(self, expiration_time): self.cache = {} self.expiration_time = expiration_time def get(self, key): if key in self.cache: value, timestamp = self.cache[key] if time.time() - timestamp < self.expiration_time: return value else: del self.cache[key] return None def set(self, key, value): self.cache[key] = (value, time.time()) def clean(self): current_time = time.time() self.cache = {k: v for k, v in self.cache.items() if current_time - v[1] < self.expiration_time} # Usage cache = TimedCache(expiration_time=60) # ΠΡΠ΅ΠΌΡ ΠΆΠΈΠ·Π½ΠΈ ΠΊΡΡΠ° cache.set('user_1', {'name': 'Alice', 'age': 30}) print(cache.get('user_1')) time.sleep(61) # ΠΠ°Π½Π½ΡΠ΅ ΡΡΡΠ°ΡΠ΅Π²Π°ΡΡ print(cache.get('user_1'))
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ:
{'name': 'Alice', 'age': 30} None
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ½ΡΡ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠΎΠ² Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ
ΠΠΎΠ³Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², Π²Π°ΠΆΠ½ΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡΡ ΠΏΠ°ΠΌΡΡΡ ΠΏΠΎΡΠ»Π΅ ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ. ΠΠΎΠ½ΡΠ΅ΠΊΡΡΠ½ΡΠ΅ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΡ with ΠΏΠΎΠΌΠΎΠ³Π°ΡΡ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎ ΠΎΡΠΈΡΠ°ΡΡ ΡΠ΅ΡΡΡΡΡ, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΎΡΠΈΠ±ΠΊΠ°
class TempResource: def __init__(self): self.data = [0] * 1000000 def __enter__(self): return self def __exit__(self, exc_type, exc_val, exc_tb): del self.data with TempResource() as resource: # ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ pass # ΠΠΎΡΠ»Π΅ Π²ΡΡ ΠΎΠ΄Π° ΠΈΠ· Π±Π»ΠΎΠΊΠ° self.data ΡΠ΄Π°Π»ΠΈΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ
Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΠΏΠΎΠ»Π΅Π·Π΅Π½ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ, ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡΠΌΠΈ, Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ ΠΈ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΠ΅ΡΡΡΡΠ°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ½ΠΎ ΡΠ²ΠΎΠ΅Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΡΠΈΡΠ°ΡΡ, ΡΡΠΎΠ±Ρ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π»ΠΈ ΡΡΠ΅ΡΠΊΠΈ ΠΏΠ°ΠΌΡΡΠΈ.
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π±ΠΎΠ»ΡΡΠΈΡ Π΄Π°Π½Π½ΡΡ Π² pandas
ΠΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ ΡΠ°Π±Π»ΠΈΡΠ°ΠΌΠΈ, ΡΠΎΡΡΠΎΡΡΠΈΠΌΠΈ ΠΈΠ· ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ΠΎΠ² ΡΡΡΠΎΠΊ, Π½Π΅ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ Π·Π°Π³ΡΡΠΆΠ°ΡΡ Π²Π΅ΡΡ ΡΠ°ΠΉΠ» Π² ΠΏΠ°ΠΌΡΡΡ. Pandas ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎΡΡΠΈΡΠΌΠΈ (ΡΠ°Π½ΠΊΠ°ΠΌΠΈ), ΡΡΠΎΠ±Ρ ΡΠ½ΠΈΠ·ΠΈΡΡ Π½Π°Π³ΡΡΠ·ΠΊΡ Π½Π° ΠΏΠ°ΠΌΡΡΡ:
import pandas as pd def process_large_csv(file_path, chunk_size=10000): for chunk in pd.read_csv(file_path, chunksize=chunk_size): # Process each chunk processed_chunk = chunk.apply(some_processing_function) yield processed_chunk for processed_data in process_large_csv('large_dataset.csv'): # ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π΄Π°Π½Π½ΡΡ print(processed_data.head())
ΠΡΠΎΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΈΠ΄Π΅Π°Π»Π΅Π½ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ Π² Π΄Π΅ΡΡΡΠΊΠΈ Π³ΠΈΠ³Π°Π±Π°ΠΉΡ:
- ΠΠ°Π³ΡΡΠΆΠ°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Π° ΡΠ°ΡΡΡ Π΄Π°Π½Π½ΡΡ Π·Π° ΡΠ°Π·.
- ΠΠΎΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π»ΡΠ±ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ ΡΠ°Π½ΠΊΠ°ΠΌΠΈ ΠΏΠΎ ΠΌΠ΅ΡΠ΅ Π·Π°Π³ΡΡΠ·ΠΊΠΈ.
- ΠΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ Π΄Π»Ρ ΡΡΠΊΠΎΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠ°.
Π Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΡΡ β ΡΡΠΎ ΡΠΎΡΠ΅ΡΠ°Π½ΠΈΠ΅ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ, Π²Π½Π΅ΡΠ½ΠΈΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² ΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΉ. ΠΡΠ»ΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΠΏΠΎΠ΄ΠΎΠ±ΡΠ°ΡΡ ΡΠ΅Ρ Π½ΠΈΠΊΡ ΠΏΠΎΠ΄ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ Π·Π°Π΄Π°ΡΡ, ΠΌΠΎΠΆΠ½ΠΎ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΡΠΊΠΎΡΠΈΡΡ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈ ΡΠΌΠ΅Π½ΡΡΠΈΡΡ ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΡΡΡΠΎΠ².
ΠΡΠΈ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ΅ ΡΡΠ°ΡΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»Π°ΡΡ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ 6 Powerful Python Techniques for Efficient Memory Management.