مقدمه؛ چرا Python 3.15 یک نسخه معمولی نیست؟
هر سال یک نسخهی جدید پایتون منتشر میشود و اغلب اوقات، این انتشارها ترکیبی از چند بهبود جزئی و چند syntax sugar هستند. اما Python 3.15 از آن دسته نسخههایی است که چند مسئلهی ساختاری و دیرینه را همزمان هدف قرار داده: زمان راهاندازی کند، نبود ساختار دادهی immutable در هستهی زبان، وابستگی به الگوهای دستی برای sentinel، و البته سایهی سنگین GIL روی همروندی. این نسخه UTF-8 را بهعنوان encoding پیشفرض ورودی/خروجی در همهی پلتفرمها تثبیت میکند، یک profiler نمونهبرداری با فرکانس بالا ارائه میدهد، C API جدیدی برای ساخت بافر معرفی میکند و پیشنهادهای AttributeError را برای اعضای تودرتو بهبود میبخشد.
فعلاً نسخهی نهایی منتشر نشده و آنچه در دسترس است، Release Candidate اول (rc1) است.
وضعیت Python در سال ۲۰۲۶؛ رقابت سرعت، تایپ و مقیاسپذیری
پایتون سالهاست زیر فشار سه جبهه است: زبانهای سریعتر مثل Rust و Go در بکاند، فشار برای type-safety شبیه TypeScript در پروژههای بزرگ، و رشد انفجاری بارهای کاری AI/ML که به همروندی واقعی نیاز دارند. تیم CPython در چند سال اخیر مسیر مشخصی را دنبال کرده: افزودن JIT تجربی، آزاد کردن GIL بهصورت اختیاری PEP 703، و اکنون تثبیت تدریجی این ابزارها. Python 3.15 نقطهای است که بسیاری از این خطهای موازی به هم میرسند.
Python 3.15.0rc چیست و چرا Release Candidate اهمیت دارد؟
Python 3.15.0rc1 اولین نسخه از دو release candidate برنامهریزیشده است. با ورود به فاز release candidate، فقط تغییرات کد بازبینیشده که بهوضوح رفع باگ باشند مجاز هستند و از این به بعد هیچ تغییری در ABI رخ نخواهد داد. به زبان ساده، rc1 یعنی فهرست ویژگیها قفل شده و آنچه میبینید همان چیزی است که در نسخهی نهایی خواهید داشت؛ فقط باگها اصلاح میشوند.
نسخهی بعدی، rc2، برای تاریخ ۱ سپتامبر ۲۰۲۶ برنامهریزی شده است و نسخهی نهایی برای اکتبر ۲۰۲۶ هدفگذاری شده. برای توسعهدهندگانی که کتابخانه نگهداری میکنند، این یعنی الان زمان تست wheel های باینری در برابر rc1 است، چون از این نقطه به بعد ABI پایدار میماند.
تغییرات بنیادین در موتور CPython
بهبود Interpreter
نسخهی ویندوز از تفسیرگر tail-calling استفاده میکند که به بهبود عملکرد کلی کمک میکند.
نسل جدید بهینهسازیها
بخشی از سرعت این نسخه از بهینهسازیهای سطح بایتکد و کاهش overhead فراخوانیهای داخلی میآید، نه صرفاً از .JIT
نقش JIT
<cite index="1-1"> کامپایلر JIT ارتقای قابلتوجهی یافته و بهبود عملکرد ۸ تا ۹ درصدی (geometric mean) روی x86-64 لینوکس نسبت به تفسیرگر استاندارد، و ۱۲ تا ۱۳ درصد سرعت بیشتر روی AArch64 مک روی نسبت به تفسیرگر tail-calling ارائه میدهد. این JIT هنوز تجربی است، اما فاصلهاش با production کوچکتر شده است.
Lazy Imports؛ آیا مشکل کندی Startup بالاخره حل میشود؟
مهمترین ویژگی این نسخه از نظر بسیاری از توسعهدهندگان، PEP 810 است. این نسخه با کلیدواژهی lazy برای بارگذاری معوق ماژولها معرفی میشود که طبق گزارش تیم توسعه میتواند زمان راهاندازی را تا ۷۰ درصد در کدبیسهای بزرگ در شرکتهایی مثل Meta کاهش دهد.
عملاً این یعنی import هایی که در نوک فایل نوشته میشوند اما بلافاصله استفاده نمیشوند، تا لحظهی نیاز واقعی بارگذاری نمیشوند. برای پروژههای بزرگ با صدها ماژول وابسته مثلاً یک مونولیت Django یا یک سرویس داده با دهها کتابخانهی سنگین مثل pandas، این تفاوت بهشدت محسوس است.
frozendict؛ ورود رسمی Immutable Data Structures به هسته پایتون
PEP 814 نوع built-in بهنام frozendict را اضافه میکند .تا امروز، برنامهنویسان برای دیکشنری غیرقابلتغییر یا از types.MappingProxyType استفاده میکردند یا کتابخانهی شخصثالث. اکنون frozendict بهعنوان نوع درجهیک زبان در دسترس است ، نکتهای که برای الگوهای functional، کشکردن ایمن و پاسدادن config های immutable بین thread ها بهخصوص در دنیای free-threaded اهمیت دارد.
Sentinel استاندارد؛ پایان الگوهای قدیمی object()
PEP 661 نوع built-in sentinel را اضافه میکند. الگوی رایج _MISSING = object() برای نشاندادن «مقدار داده نشده» اکنون یک معادل رسمی و قابل serialize/repr در استاندارد کتابخانه دارد. تغییر کوچکی است اما دردی واقعی را در APIهای عمومی (مثل پارامترهای پیشفرض توابع) رفع میکند.
تحول Type System و آینده پایتون تایپمحور
پایتون تایپمحور دیگر یک گرایش حاشیهای نیست، بلکه استاندارد de facto در تیمهای بزرگ شده است. (TypeForm) طبق PEP 747 نحوی درجهیک برای annotate کردن type expressionها فراهم میکند که برای ابزارهایی مثل mypy و pyright که خودشان type را بهعنوان مقدار پاس میدهند، اهمیت زیادی دارد.
TypedDict ، TypeForm و تأثیر آنها روی پروژههای بزرگ
TypedDict قابلیت closed و extra_items را طبق PEP 728 دریافت میکند. این یعنی توسعهدهنده میتواند صراحتاً مشخص کند که یک TypedDict اجازهی کلیدهای اضافی دارد یا خیر ، مشکلی که تا امروز باعث false negative های زیاد در type checkerها هنگام کار با پاسخهای API یا دادههای JSON میشد.
همچنین ماژول جدید math.integer توابع مختص اعداد صحیح را در یکجا گرد میآورد .(PEP 791)
Profiling و Observability ؛ پایتون برای Production آمادهتر میشود
یک بستهی profiling اختصاصی برای سازماندهی ابزارهای profiling پایتون اضافه شده و درون آن، Tachyon بهعنوان یک نمونهبردار آماری با فرکانس بالا معرفی میشود. Tachyon میتواند تا فرکانس یک میلیون هرتز نمونهبرداری کند، با overhead نزدیک به صفر به یک پردازش در حال اجرا متصل شود، و خروجیهایی مانند flamegraph، فایلهای سازگار با Gecko در فایرفاکس و یک TUI زنده تولید کند.
علاوه بر این، frame pointer ها بهصورت پیشفرض برای بهبود observability در سطح سیستم فعال شدهاند (PEP 831) .این یعنی ابزارهای سیستمی مثل perf در لینوکس میتوانند بدون نیاز به build سفارشی، استک فراخوانی پایتون را با دقت بیشتری ببینند قابلیتی حیاتی برای دیباگ عملکرد در محیطهای production در مقیاس بزرگ.
UTF-8 پیشفرض؛ پایان یکی از مشکلات قدیمی Cross-platform
طبق PEP 686، عملیات text I/O بدون تعیین صریح encoding اکنون بهصورت پیشفرض از UTF-8 استفاده میکند و این رفتار عجیب مختص ویندوز را از بین میبرد؛ این رفتار با متغیر محیطی PYTHONUTF8 = 0) ) قابل غیرفعالسازی است .برای تیمهایی که کد را روی ویندوز و لینوکس/مک همزمان اجرا میکنند، این یکی از قدیمیترین منابع باگهای ناسازگار encoding را حذف میکند.
تغییرات C API و تأثیر آن بر Extensionها
این نسخه C API جدیدی بهنام PyBytesWriter برای ساخت بافر بهشکل کارآمدتر معرفی میکند. نگهدارندگان extensionهای C/Cython/pybind11 باید توجه داشته باشند که با ورود به فاز rc، دیگر تغییری در ABI رخ نخواهد داد، پس الان بهترین زمان برای build و انتشار wheel های سازگار با 3.15 است.
Free-threading ؛ آیا دوران محدودیتهای GIL نزدیک است؟
اینجا باید واقعبین بود Python 3.15 :هنوز GIL را بهصورت پیشفرض حذف نمیکند .با تصویب PEP 779، تفسیرگر
free-threaded از Python 3.14 دیگر تجربی محسوب نمیشود، هرچند هنوز build پیشفرض تفسیرگر نیست.
در build آزاد از GIL، هنگام import یک ماژول C-API که صراحتاً پشتیبانی از free threading را اعلام نکرده، ممکن است GIL بهصورت خودکار دوباره فعال شود و در این حالت هشداری چاپ میشود .یعنی اکوسیستم هنوز در حال catch-up است هر کتابخانهی C که آپدیت نشده باشد، عملاً free-threading را خنثی میکند.
از نظر کارایی، buildآزاد از GIL هنگام اجرای کد پایتون overhead بیشتری نسبت به build پیشفرض دارد و این overhead بسته به بار کاری و سختافزار متفاوت است؛ در benchmark مجموعهی pyperformance، این overhead بهطور میانگین از حدود ۱ درصد در macOS aarch64 تا ۸ درصد در سیستمهای x86-64 لینوکس متغیر است .بنابراین free-threading رایگان نیست؛ یک trade-off بین موازیسازی واقعی و سرعت تکرشتهای است.
Python 3.15 در برابر Python 3.14؛ چه چیزی واقعاً تغییر کرده؟
|
محور |
Python 3.14 |
Python 3.15 |
|
Startup |
استاندارد |
Lazy imports، تا ۷۰٪ سریعتر در کدبیسهای بزرگ |
|
Immutable data |
نبود نوع built-in |
frozendict رسمی |
|
Sentinel pattern |
دستی (object()) |
نوع built-in استاندارد |
|
Type system |
TypedDict پایه |
TypedDict با closed/extra_items، TypeForm |
|
Profiling |
ابزارهای پراکنده |
بستهی اختصاصی + Tachyon |
|
Encoding |
وابسته به پلتفرم |
UTF-8 پیشفرض همهجا |
|
Free-threading |
Supported )غیرپیشفرض) |
همچنان غیرپیشفرض، اکوسیستم بالغتر |
|
JIT |
پایه |
۸ تا ۱۳٪ سریعتر |
نقاط قوت Python 3.15
· کاهش واقعی و قابلاندازهگیری زمان startup برای پروژههای بزرگ
· ابزارهای profiling درجهیک و آمادهی production (Tachyon)
· بلوغ تدریجی و بدونشتاب type system، بدون شکستن سازگاری
· رفع دردهای قدیمی encoding)، (sentinel بدون نیاز به کتابخانهی شخصثالث
· ABI پایدار از rc1 به بعد، یعنی ریسک کمتر برای maintainerها
نقاط ضعف و نگرانیهای مهاجرت
· free-threading هنوز default نیست و خیلی از C extensionها آماده نیستند
· JIT هنوز experimental است و برای همهی بارهای کاری سود یکسان ندارد
· lazy imports میتواند رفتار برنامههایی را که به side effect زمان import متکیاند تغییر دهد(باید صراحتاً با کلیدواژهی lazy فعال شود، اما تیمها باید الگوهای import خود را بازبینی کنند)
· برای تیمهایی با کتابخانههای legacy C، باز هم لازم است صبر کرد تا ecosystem کامل sync شود
آیا توسعهدهندگان باید به Python 3.15 مهاجرت کنند؟
برای پروژههای production در حال حاضر: هنوز نه با نسخهی rc اما اکنون بهترین زمان برای:
· تست کدبیس در برابر rc1)بدون تغییر ABI بیشتر)
· ساخت و انتشار wheel های سازگار روی PyPI
· ارزیابی سود lazy imports روی زمان startup واقعی پروژه
برای پروژههای جدید یا کتابخانههای در حال توسعه: بله، ارزش برنامهریزی برای سازگاری را دارد، مخصوصاً اگر پروژه به CLI tool یا سرویسی با startup مکرر وابسته باشد.
آینده پایتون بعد از نسخه 3.15
روند مشخص است JIT :قویتر میشود، free-threading به سمت default حرکت میکند (هرچند احتمالاً نه در 3.15 یا حتی 3.16)، و type system همچنان به سمت TypeScript-like بودن پیش میرود. Lazy imports و frozendict نشان میدهند CPython دیگر فقط دنبال syntax sugar نیست، بلکه مشکلات ساختاری واقعی مقیاس بزرگ را هدف قرار داده است.
چکیده مقاله
Python 3.15rc1 نسخهای است که بهجای یک ویژگی چشمگیر، مجموعهای از بهبودهای بنیادین و بهموقع را ارائه میدهد: startup سریعتر، ابزارهای production-grade برای observability، ساختارهای دادهی immutable رسمی، و تثبیت تدریجی مسیر آزاد شدن از .GIL هیچکدام از اینها بهتنهایی انقلابی نیست، اما مجموع آنها تصویر یک زبان را نشان میدهد که دارد جدیتر برای مقیاس بزرگ و بارهای کاری AI/production آماده میشود.
References
Python Release Python 3.15.0rc1 | Python.org
python.org/downloads/release/python-3150rc1
Python 3.15.0rc1 Released: Lazy Imports, Built-in frozendict, and Tachyon Profiler — linuxcompatible.org
linuxcompatible.org/story/python-3150rc1-released-lazy-imports-builtin-frozendict-and-tachyon-profiler
What's new in Python 3.15 — Python 3.15.0rc1 documentation
docs.python.org/3.15/whatsnew/3.15.html
Python 3.15.0 release candidate 1 is here! — Discussions on Python.org
discuss.python.org/t/python-3-15-0-release-candidate-1-is-here/108395
Python 3.15 - What's New, Support Lifecycle & EOL — VersionLog
versionlog.com/python/3.15
Python 3.15 features: The Ultimate Guide to New Changes — runfreetools.com
runfreetools.com/blog/python-3-15-features
Python Free-Threading Guide
py-free-threading.github.io
نظرات کاربران
هنوز نظری ثبت نشده است. اولین نفری باشید که نظر خود را مینویسد!