انتشار Python 3.15؛ از unpacking در comprehension تا Tachyon و اجرای free-threaded

چرا مهم است

اگر با Python کار می‌کنی، این نسخه هم نوشتن بعضی عبارت‌ها را ساده‌تر می‌کند و هم ابزار تازه‌ای برای پیدا کردن بخش‌های کند دارد. اما برای تصمیم به ارتقا، باید سرعت و سازگاری برنامه خودت را بسنجی.

قبل از خواندن، این‌ها را بدان۵ مفهوم
Unpacking

بازکردن اعضای یک مجموعه برای استفاده جداگانه از آن‌ها؛ در Python معمولاً با * برای عضوها و ** برای جفت‌های کلید و مقدار انجام می‌شود.

بیشتر درباره این مفهوم

Comprehension

روشی فشرده در Python برای ساختن list، set یا dictionary با پیمایش داده‌ها و در صورت نیاز اعمال شرط.

بیشتر درباره این مفهوم

Profiler

ابزاری برای بررسی رفتار اجرایی برنامه و مشخص‌کردن بخش‌هایی که زمان یا منابع بیشتری مصرف می‌کنند.

بیشتر درباره این مفهوم

نمایش همه (۵)
Benchmark

آزمایشی با کار مشخص برای اندازه‌گیری و مقایسه عملکرد؛ نتیجه آن به شرایط اجرا و نوع کار انتخاب‌شده وابسته است.

بیشتر درباره این مفهوم

Global Interpreter Lock (GIL)

سازوکاری در build استاندارد CPython که اجرای هم‌زمان bytecode توسط چند thread را محدود می‌کند.

بیشتر درباره این مفهوم

Python 3.15.0 روز ۹ اکتبر، با هشت روز تأخیر منتشر شد. طبق اعلام Hugo van Kemenade، مسئول انتشار، این نسخه حاصل ۵٬۶۴۳ commit از ۱٬۰۱۲ مشارکت‌کننده از زمان Python 3.14 است. lazy imports، frozendict، built-in جدید sentinel و استفاده پیش‌فرض از UTF-8 برای encoding، از تغییرهای اصلی آن هستند.

یکی از تغییرهای کاربردی، PEP 798 است که Unpacking را داخل Comprehension ممکن می‌کند. برای تبدیل یک list شامل چند list به یک list تخت، حالا می‌توان از [*x for x in lists] استفاده کرد؛ بدون نیاز به loop تودرتو یا itertools.chain(). علامت ستاره برای هر مورد فقط یک سطح را باز می‌کند. در dictionary نیز {**p for p in profiles} قابل استفاده است و اگر کلیدی تکرار شود، مقدار مربوط به مورد بعدی باقی می‌ماند.

تغییر مهم دیگر، Tachyon است؛ یک Profiler از نوع sampling که با PEP 799 در package جدید profiling عرضه می‌شود. این ابزار از بیرون stack برنامه را نمونه‌برداری می‌کند، سربار کمی دارد و می‌تواند به process در حال اجرا متصل شود. برای بررسی یک script نیازی به تغییر آن نیست؛ دستور python -m profiling.sampling run slow.py خروجی برنامه و گزارش اندازه‌گیری را نمایش می‌دهد. افزودن --flamegraph -o profile.html هم یک flame graph تعاملی تولید می‌کند.

در بخش سرعت، نتیجه‌ها یکسان نیستند. در Benchmark مربوط به سومین release candidate، Miguel Grinberg زمان اجرای fib(40) را در Python 3.14 برابر ۷٫۱۷ ثانیه و در Python 3.15 برابر ۶٫۹۴ ثانیه اندازه گرفت؛ حدود سه درصد بهبود. JIT آزمایشی این زمان را به ۵٫۷۶ ثانیه رساند، اما او همچنان استفاده از آن در production را توصیه نمی‌کند.

تفاوت بزرگ‌تر در اجرای free-threaded دیده شد. اجرای هم‌زمان چهار محاسبه fib(40) با چهار thread در build استاندارد، با Global Interpreter Lock (GIL)، حدود ۳۲٫۵ ثانیه طول کشید؛ build از نوع free-threaded همان کار را در ۷٫۲ ثانیه انجام داد. این نتیجه مربوط به همین آزمایش است، نه تضمین افزایش سرعت برای هر برنامه.

نصب‌کننده macOS اکنون پشتیبانی free-threading را به‌صورت پیش‌فرض نصب می‌کند. بااین‌حال، گزارش درباره macOS 27.0 هشدار می‌دهد: یک تغییر در سطح سیستم‌عامل ممکن است هنگام بازشدن dialog از منو، IDLE و دیگر برنامه‌های Tkinter را متوقف کند. نخستین alpha از Python 3.16 نیز چهار روز پس از انتشار 3.15 عرضه شد.

نکته کلیدی

قبل از نتیجه‌گیری درباره سرعت نسخه جدید، یک Benchmark از کار واقعی برنامه‌ات بگیر. برای پیدا کردن محل کندی هم Tachyon را امتحان کن؛ نتیجه آزمایش چهار thread را به همه برنامه‌ها تعمیم نده.

خواندن مقاله اصلی (در زبانه‌ی جدید باز می‌شود)
برچسب‌ها (۳)