πŸ“šPython Books
33.7K subscribers
1.13K photos
3 videos
93 files
1.12K links
πŸ“šPython Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°

admin - @haarrp

@ai_machinelearning_big_data - машинноС ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅

@programming_books_it - бСсплатныС it ΠΊΠ½ΠΈΠ³ΠΈ

@pythonl - 🐍

@ArtificialIntelligencedl - AI

@datascienceiot - ml

РКН: clck.ru/3FmsTi
Download Telegram
🐍 Free-threaded Python ΡƒΠ±Ρ€Π°Π» GIL, Π½ΠΎ NumPy всё Ρ€Π°Π²Π½ΠΎ упирался Π²ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ

Казалось Π±Ρ‹, Python 3.13+ Π±Π΅Π· GIL Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ нСскольким ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ числСнныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.

Но Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Π΅ ufunc Π½Π°Ρ‡ΠΈΠ½Π°Π»ΠΈ ΠΊΠΎΠ½ΠΊΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π° Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ структуры NumPy, счётчики ссылок ΠΈ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти.

Π’ NumPy 2.5 Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ устранили нСсколько ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… ΡƒΠ·ΠΊΠΈΡ… мСст:

- Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ диспСтчСризации ufunc Π·Π°ΠΌΠ΅Π½ΠΈΠ»ΠΈ Π½Π° lock-free concurrent hash map;
- Ρ‡Π°ΡΡ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΡ… слуТСбных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² сдСлали «бСссмСртными», снизив ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ†ΠΈΡŽ ΠΏΡ€ΠΈ подсчётС ссылок;
- Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти ΠΏΠ΅Ρ€Π΅Π²Π΅Π»ΠΈ Π½Π° PyMem_RawMalloc ΠΈ PyMem_RawFree.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ нСзависимыС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ:


from concurrent.futures import ThreadPoolExecutor

import numpy as np

arrays = [
np.random.rand(5_000_000)
for _ in range(8)
]

with ThreadPoolExecutor(max_workers=8) as pool:
results = list(pool.map(np.sin, arrays))


Π“Π»Π°Π²Π½ΠΎΠ΅ прСимущСство ΠΏΠ΅Ρ€Π΅Π΄ multiprocessing - массивы Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами.

ΠŸΠΎΡ‚ΠΎΠΊΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π² ΠΎΠ΄Π½ΠΎΠΌ адрСсном пространствС, поэтому ΠΌΠΎΠ³ΡƒΡ‚ эффСктивнСС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ многоядСрный CPU ΠΈ ΠΎΠ±Ρ‰ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ.

Но Π΅ΡΡ‚ΡŒ ваТная ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΊΠ°:

free-threaded Π½Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ автоматичСски thread-safe.

ΠžΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ndarray ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² всё Π΅Ρ‰Ρ‘ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π³ΠΎΠ½ΠΊΠ°ΠΌ, ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Ρ‘Π½Π½Ρ‹ΠΌ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈ падСнию ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°.

БСзопаснСС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ:

- ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ массив для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ worker;
- ΠΎΠ±Ρ‰ΠΈΠΉ массив Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния;
- ΡΠ²Π½ΡƒΡŽ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΡ€ΠΈ записи.

Π£Π΄Π°Π»ΠΈΡ‚ΡŒ GIL оказалось нСдостаточно. Π§Ρ‚ΠΎΠ±Ρ‹ Python Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π»ΡΡ ΠΏΠΎ ядрам, ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΏΠ΅Ρ€Π΅ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ внутрСнности NumPy.

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅:
https://labs.quansight.org/blog/scaling-numpy-on-free-threaded-python