الان نسخه پایدار پایتون 3.14.7 هست که اوایل آگوست ۲۰۲۶ منتشر شده و خودش بیشتر یه آپدیت نگهداریه؛ یعنی تمرکزش روی رفع باگها، بهبود build و مستنداته. جالب اینجاست که همین نسخه حدود ۴۹۹ اصلاح و تغییر از ۸۶ مشارکتکننده داشته. (blog.python.org)
ولی بخش جذاب ماجرا Python 3.15 هست.
در حال حاضر Python 3.15.0 RC1 منتشر شده؛ یعنی عملاً قابلیتهای اصلی نسخه مشخص شدن و پروژه وارد مرحلهای شده که بیشتر تمرکز روی رفع باگ و آمادهشدن برای نسخه نهاییه. نسخه نهایی هم طبق برنامه باید در پاییز ۲۰۲۶ منتشر بشه. RC1 هنوز برای استفاده روی Production پیشنهاد نمیشه، ولی برای تست پروژهها تقریباً همون چیزیه که قراره در نسخه نهایی ببینیم. (blog.python.org)
Lazy Import؛ بالاخره importها تنبل میشن
یکی از قابلیتهایی که شخصاً به نظرم خیلی کاربردیه، Explicit Lazy Imports هست.
الان وقتی یه ماژول رو import میکنیم، پایتون همون لحظه باید ماژول رو پیدا کنه، بخونه و کد اولیهش رو اجرا کنه. تو پروژههای بزرگ که dependency زیاد دارن، همین موضوع میتونه زمان startup رو حسابی بالا ببره.
در Python 3.15 میشه این شکلی نوشت:
lazy import json
lazy from pathlib import Path
در این حالت ماژول تا زمانی که واقعاً ازش استفاده نکنیم load نمیشه.
یعنی بهجای اینکه خودمون import رو ببریم داخل function یا با importlib بازی کنیم، خود زبان راه استانداردی برای این کار داده. برای CLIها، ابزارهای بزرگ و برنامههایی که dependency زیاد دارن این قابلیت احتمالاً خیلی مفید میشه. (docs.python.org)
frozendict؛ چیزی که مدتها جاش خالی بود
Python 3.15 یه type داخلی جدید به اسم frozendict اضافه کرده.
اگر با frozenset کار کرده باشید، ایده تقریباً همونه؛ یه dictionary داریم که بعد از ساخت دیگه قابل تغییر نیست.
config = frozendict({
"debug": False,
"port": 8000
})
این موضوع مخصوصاً برای configها، cache keyها یا جاهایی که میخوایم مطمئن باشیم داده تغییر نمیکنه کاربردیه.
frozendict حتی در صورتی که key و valueهای داخلش hashable باشن، خودش هم hashable میشه. (docs.python.org)
Sentinel هم بالاخره استاندارد شد
یه قابلیت کوچیک ولی تمیز دیگه، اضافهشدن sentinel به خود زبان هست.
تا الان احتمالاً بارها چیزهایی شبیه این دیدیم:
_MISSING = object()
و بعد از _MISSING استفاده میکردیم تا بفهمیم یه مقدار واقعاً ارسال نشده یا مثلاً مقدارش None بوده.
در 3.15 برای همین الگو یه type استاندارد به اسم sentinel وجود داره. یعنی یکی از اون patternهای خیلی رایج پایتون بالاخره وارد خود زبان شده. (docs.python.org)
داستان مهمتر: JIT پایتون داره جدی میشه
به نظرم جذابترین قسمت Python 3.15 اصلاً syntaxهای جدید نیست؛ سرعته.
نمونهای از تفاوت عملکرد نسخههای مختلف Python در PyPerformance؛ این نمودار مربوط به نسخههای 3.8 تا 3.11 است و صرفاً برای دیدن روند تفاوت performance بین نسخهها قرار گرفته.
JIT Compiler پایتون نسبت به نسخه 3.14 تغییرات جدی داشته و طبق benchmarkهای خود پروژه Python، روی مجموعه تست pyperformance در Linux x86-64 بهطور میانگین هندسی حدود ۸ تا ۹ درصد سریعتر از interpreter استاندارد بوده.
روی macOS با معماری ARM64 این عدد حدود ۱۲ تا ۱۳ درصد گزارش شده. (github.com)
البته اینجا باید یه نکته رو بگیم: این یعنی «تمام برنامههای Python دوازده درصد سریعتر میشن»؟ نه.
خود تستها بسته به workload از حدود ۱۵٪ کندتر تا حتی بیشتر از ۱۰۰٪ سریعتر نتیجه داشتن. پس JIT هنوز چیزی نیست که برای همه کدها یک نتیجه ثابت بده. (github.com)
ولی جهت حرکت کاملاً مشخصه.
این نمودار مربوط به روند توسعه JIT در Python 3.15 هست و نشون میده تیم CPython طی چند ماه چطور performance رو روی معماریهای مختلف جلو برده.
روی ویندوز هم خبرهای خوبی هست
یه تغییر جالب دیگه اینه که نسخه رسمی ۶۴ بیتی Windows پایتون حالا از tail-calling interpreter استفاده میکنه.
طبق تستهایی که در مستندات CPython منتشر شده، روی Windows x86-64 و یک Ryzen 7 5800X میانگین pyperformance چیزی حدود ۱۵ تا ۲۰ درصد بهبود داشته.
بسته به نوع برنامه، تیم Python حتی بهبودهایی حدود ۱۴٪ تا ۴۰٪ هم گزارش کرده. (github.com)
این یکی از تغییراتیه که احتمالاً خیلی از کاربرها بدون اینکه حتی کدشون رو تغییر بدن ازش سود میبرن.
بعضی بخشهای کتابخونه استاندارد هم خیلی سریعتر شدن
بهبود سرعت فقط مربوط به JIT نیست.
مثلاً implementation مربوط به base64 تغییر کرده و طبق مستندات Python، encoding حدود ۲ برابر و decoding حدود ۳ برابر سریعتر شده.
از اون جالبتر، پیادهسازی Ascii85، Base85 و Z85 به C منتقل شده و در بعضی عملیاتها چیزی در حد دو مرتبه بزرگی بهبود سرعت و مصرف حافظه گزارش شده.
Base32 هم با بازنویسی C، بهبود مشابهی گرفته. (github.com)
اینها ممکنه featureهای هیجانانگیزی برای تیتر خبر نباشن، ولی برای برنامههایی که واقعاً از این بخشها استفاده میکنن تغییرهای قابلتوجهی هستن.
Profiling هم خیلی جدیتر شده
Python 3.15 یه مجموعه ابزار profiling جدید هم داره و یکی از بخشهای جالبش profiler آماری جدیدی به اسم Tachyon هست.
هدفش اینه که بتونیم حتی به یه process در حال اجرا attach بشیم و بدون اینکه لازم باشه برنامه رو restart کنیم، بفهمیم زمان برنامه دقیقاً کجا مصرف میشه.
حتی modeهایی برای CPU time، wall-clock time و زمان نگهداشتن GIL داره.
این تغییر رو میشه بخشی از یه روند بزرگتر دونست: پایتون فقط دنبال سریعتر شدن نیست؛ داره تلاش میکنه مشاهده و عیبیابی performance در محیط واقعی رو هم راحتتر کنه. (github.com)
Free-threaded Python هم هنوز یکی از مسیرهای اصلیه
یکی دیگه از اتفاقات مهم چند نسخه اخیر پایتون، پروژه free-threaded Python و کمکردن وابستگی به GIL بوده.
در Python 3.15 برای buildهای free-threaded حتی Stable ABI و APIهای مرتبط بیشتری اضافه شده. یعنی کاملاً مشخصه که این قابلیت یه آزمایش کوتاهمدت نیست و تیم CPython داره زیرساخت ecosystem رو هم کمکم براش آماده میکنه. (blog.python.org)
در نهایت پایتون داره به کدوم سمت میره؟
اگر بخوام کل این آپدیتها رو تو یه جمله خلاصه کنم:
پایتون داره از زبانی که فقط روی سادگی و خوانایی معروف بود، به زبانی تبدیل میشه که performance هم کمکم تبدیل به یکی از اولویتهای اصلیش شده.
Lazy Import برای startup سریعتر، JIT برای اجرای سریعتر، free-threading برای parallelism بهتر و profilerهای جدید برای پیدا کردن bottleneckها، همه تقریباً یه جهت رو نشون میدن.
به نظرم Python 3.15 از اون نسخههایی نیست که صرفاً چند تا syntax جدید به زبان اضافه کنه؛ بخش مهمترش تغییراتیه که زیر پوست CPython داره اتفاق میفته.
و احتمالاً اثر واقعی همین تغییرها رو تو یکی دو نسخه بعدی خیلی بیشتر میبینیم.
دیدگاههای مقاله
۰ دیدگاه تایید شدههنوز دیدگاهی ثبت نشده است
اولین نظر یا سوالت درباره این مقاله را بنویس.