π₯ ΠΠ°ΠΊ ΠΏΠ΅ΡΠ΅Π½Π΅ΡΡΠΈ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΡ Π² Python: ΡΠΎΠ²Π΅ΡΡ ΠΈ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ
ΠΠ΅ΡΠ΅Π½Π΅ΡΡΠΈ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΡ Π² Python ΠΌΠΎΠΆΠ½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ CUDA ΠΈ ΡΠ·ΡΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ CUDA C/C++. ΠΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ:
import numpy as np
from numba import jit, cuda
# ΠΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΡ Ρ
ΠΎΡΠΈΠΌ ΡΡΠΊΠΎΡΠΈΡΡ
@jit(target="cuda")
def calculate():
# ΠΠ°Ρ ΠΊΠΎΠ΄ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ
# ΠΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΠ΅
calculate()
Π ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ NumPy ΠΈ Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡ @jit(target="cuda") ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ numba, ΡΡΠΎΠ±Ρ ΡΡΠΊΠΎΡΠΈΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΏΠ΅ΡΠ΅Π½Π΅ΡΡ Π΅Π΅ Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΡ. ΠΠ΄Π½Π°ΠΊΠΎ, ΡΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ CUDA, Π²Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ NVIDIA GPU ΠΈ Π΄ΡΠ°ΠΉΠ²Π΅ΡΡ CUDA.
ΠΠ΅ΡΠ°Π»ΡΠ½ΡΠΉ ΠΎΡΠ²Π΅Ρ
ΠΠ°ΠΊ ΠΏΠ΅ΡΠ΅Π½Π΅ΡΡΠΈ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΡ Π² Python
ΠΠ΅ΡΠ΅Π½ΠΎΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΡ Π² Python ΠΌΠΎΠΆΠ΅Ρ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΡΠΊΠΎΡΠΈΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΡΠ΅Ρ , ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠ΅Π±ΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π±ΠΎΠ»ΡΡΠΈΡ ΠΎΠ±ΡΠ΅ΠΌΠΎΠ² Π΄Π°Π½Π½ΡΡ ΠΈΠ»ΠΈ ΡΠ»ΠΎΠΆΠ½ΡΡ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ. Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΎΠ² ΠΊ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΡ Π² Python Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ CUDA.
1. Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ CUDA
ΠΠ΅ΡΠ΅Π΄ ΡΠ΅ΠΌ, ΠΊΠ°ΠΊ Π½Π°ΡΠ°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ CUDA, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ. ΠΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ΡΡ ΠΊ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ NVIDIA Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ ΠΏΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ CUDA.
2. Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ PyCUDA
PyCUDA - ΡΡΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡΠ°Ρ ΠΏΡΠΎΡΡΠΎΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ CUDA Π½Π° Python. Π§ΡΠΎΠ±Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ PyCUDA, Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
pip install pycuda
3. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ PyCUDA Π΄Π»Ρ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ
PyCUDA ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠΎΡΠ½ΠΎΡΡΠΈ Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΡ Π΄Π»Ρ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΈΠΌΠ΅Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΡΡΠΌΠΌΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π²Π΅ΠΊΡΠΎΡΠ° Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΠ΅:
import numpy as np
import pycuda.autoinit
import pycuda.gpuarray as gpuarray
from pycuda.reduction import sum
# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ³ΠΎ Π²Π΅ΠΊΡΠΎΡΠ°
vector = np.random.randn(1000000).astype(np.float32)
# ΠΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²Π΅ΠΊΡΠΎΡΠ° Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΡ
gpu_vector = gpuarray.to_gpu(vector)
# ΠΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΡΡΠΌΠΌΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΠ΅
sum_gpu = sum(gpu_vector).get()
print(sum_gpu)
Π ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΌΡ ΡΠ½Π°ΡΠ°Π»Π° ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΉ Π²Π΅ΠΊΡΠΎΡ Π½Π° CPU, Π·Π°ΡΠ΅ΠΌ ΠΊΠΎΠΏΠΈΡΡΠ΅ΠΌ Π΅Π³ΠΎ Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ `to_gpu` ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ PyCUDA. ΠΠ°ΡΠ΅ΠΌ ΠΌΡ Π²ΡΡΠΈΡΠ»ΡΠ΅ΠΌ ΡΡΠΌΠΌΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π²Π΅ΠΊΡΠΎΡΠ° Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ `sum` ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π° `get`.
4. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Numba Π΄Π»Ρ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ
ΠΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΊ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΡ Π² Python - ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Numba. Numba - ΡΡΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΈ JIT (just-in-time) ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π΄Π»Ρ Python, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΠ΅.
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Numba Π΄Π»Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΡΡΠΌΠΌΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π²Π΅ΠΊΡΠΎΡΠ° Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΠ΅:
import numpy as np
from numba import cuda
# Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ³ΠΎ Π²Π΅ΠΊΡΠΎΡΠ°
vector = np.random.randn(1000000).astype(np.float32)
# ΠΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²Π΅ΠΊΡΠΎΡΠ° Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΡ
d_vector = cuda.to_device(vector)
# ΠΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΡΡΠΌΠΌΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΠ΅
@cuda.jit
def sum_gpu(d_vector):
tid = cuda.threadIdx.x + cuda.blockDim.x * cuda.blockIdx.x
stride = cuda.blockDim.x * cuda.gridDim.x
sum_partial = 0.0
for i in range(tid, len(d_vector), stride):
sum_partial += d_vector[i]
cuda.atomic.add(sum_gpu, 0, sum_partial)
sum_gpu[64, 64](d_vector)
result = np.zeros(1, dtype=np.float32)
cuda.memcpy_dtoh(result, sum_gpu)
print(result[0])
Π ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΌΡ ΡΠ½Π°ΡΠ°Π»Π° ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΉ Π²Π΅ΠΊΡΠΎΡ Π½Π° CPU, Π·Π°ΡΠ΅ΠΌ ΠΊΠΎΠΏΠΈΡΡΠ΅ΠΌ Π΅Π³ΠΎ Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ `to_device` ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Numba. ΠΠ°ΡΠ΅ΠΌ ΠΌΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ `sum_gpu`, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΡΡΠΌΠΌΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π²Π΅ΠΊΡΠΎΡΠ° Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΠ΅.
ΠΡ Π°Π½Π½ΠΎΡΠΈΡΡΠ΅ΠΌ ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡΠ° `@cuda.jit`, ΡΡΠΎΠ±Ρ ΡΠΊΠ°Π·Π°ΡΡ Numba, ΡΡΠΎ ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Π° Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΠ΅. ΠΠ°ΡΠ΅ΠΌ ΠΌΡ ΡΠ°Π·Π±ΠΈΠ²Π°Π΅ΠΌ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ Π½Π° Π±Π»ΠΎΠΊΠΈ ΠΈ ΠΏΠΎΡΠΎΠΊΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ² `threadIdx` ΠΈ `blockIdx`.
Π ΠΊΠΎΠ½ΡΠ΅ ΠΌΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΡΡΠΌΠΌΡ Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ° `sum_gpu[64, 64]`, Π³Π΄Π΅ ΠΏΠ΅ΡΠ²ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π±Π»ΠΎΠΊΠΎΠ², Π° Π²ΡΠΎΡΠΎΠ΅ - ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ² Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π±Π»ΠΎΠΊΠ΅. ΠΠ°ΡΠ΅ΠΌ ΠΌΡ ΠΊΠΎΠΏΠΈΡΡΠ΅ΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π½Π° CPU ΠΈ Π²ΡΠ²ΠΎΠ΄ΠΈΠΌ Π΅Π³ΠΎ.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΠ΅ΡΠ΅Π½ΠΎΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ Π½Π° Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΡ Π² Python ΠΌΠΎΠΆΠ΅Ρ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΡΠΊΠΎΡΠΈΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ. ΠΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π»ΠΈ Π΄Π²Π° ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π°: ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ PyCUDA ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Numba. ΠΡΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠΉ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΡΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ, Π²Ρ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²ΡΡΠΈΡΠ»ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π²Π°ΡΠ΅ΠΉ Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΡ Π² Python.