Simon Willison→ المصدر

صدور Python 3.15: استيراد كسول وأداة Tachyon لتحليل الأداء وJIT أسرع بمقدار 1.2x

صدر Python 3.15. أبرز ما في الإصدار: الاستيراد الكسول الصريح (PEP 810)، والتفريغ داخل التعبيرات الاشتقاقية comprehensions (PEP 798)، ومحلل الأداء المدمج Tachyon القائم على أخذ العينات (sampling) في الوحدة profiling.sampling. من حيث السرعة، لا يختلف الإصدار كثيرًا عن 3.14، لكن مترجم JIT التجريبي حقق 1.2x في اختبار أعداد فيبوناتشي (قياس ميغيل غرينبرغ على 3.15.0rc3). مع صدور 3.15 أُنهي الدعم الرسمي عن Python 3.10. ويعني ذلك لمؤلفي المكتبات أنه صار بالإمكان اعتماد 3.11 حدًّا أدنى للإصدارات المدعومة. • يقلّص الاستيراد الكسول زمن بدء تشغيل أدوات سطر الأوامر (CLI). • تحلّ Tachyon محل محللات الأداء الخارجية مثل py-spy. • لم يعد Python 3.10 مدعومًا.

معالج بواسطة الذكاء الاصطناعي من Simon Willison؛ بتحرير Hamidun News
صدور Python 3.15: استيراد كسول وأداة Tachyon لتحليل الأداء وJIT أسرع بمقدار 1.2x
المصدر: Simon Willison. كولاج: Hamidun News.
◐ استمع للمقال

صدر Python 3.15. بالنسبة إلى أغلب المطورين، تتلخص أهمية الإصدار في ثلاثة أمور: الاستيراد الكسول الصريح، ومحلل الأداء Tachyon في المكتبة القياسية، وصيغة جديدة للتفريغ داخل التعبيرات الاشتقاقية القائمة. لم تتغير سرعة المفسّر كثيرًا مقارنة بـ 3.14، لكن مترجم JIT التجريبي سجّل لأول مرة تسارعًا ملحوظًا بلغ 1.2x. وبالتزامن مع ذلك، انتهى رسميًا دعم Python 3.10 (إصدار عام 2021). وهذا أهم لمشرفي المكتبات (maintainers) من أي صيغة جديدة، إذ يرتفع الحد الأدنى للتوافق إلى 3.11. وأعدّ ملخص التغييرات في «What's new» هذا العام Hugo van Kemenade، مدير إصدارَي 3.14 و3.15.

الاستيراد الكسول والتفريغ وTachyon

أكثر المستجدات عملية هو PEP 810. صار بالإمكان الآن التصريح بالوحدة هكذا: `lazy import json` أو `lazy from pathlib import Path`. ولا يحدث الاستيراد الفعلي إلا عند أول وصول إلى الرمز. وكان Simon Willison، مطوّر أداة سطر الأوامر LLM ذات نظام الإضافات، يصطدم بهذه المشكلة منذ وقت طويل. فالإضافات ذات الاعتماديات الثقيلة مثل `sentence_transformers` كانت تضيف بضع ثوانٍ إلى كل استدعاء للأمر `llm`. واضطر في وثائق مؤلفي الإضافات إلى نصحهم باستخدام استيراد كسول يدوي. أما الآن فاللغة نفسها تحل المشكلة.

التغيير الثاني هو PEP 798 (المؤلفان Adam Hartz وErik Demaine). يضيف هذا المقترح التفريغ داخل التعبيرات الاشتقاقية comprehensions: فالتعبير `[L for L in lists]` يحوّل قائمة القوائم إلى قائمة مسطّحة، و`{s for s in sets}` يدمج المجموعات، و`{**d for d in dicts}` يدمج القواميس. وهو امتداد لـ PEP 448 الذي ظهر في Python 3.5 عام 2015.

التغيير الثالث يخص محللات الأداء. فقد أُعيدت تسمية `cProfile` التقليدي القائم على التتبع إلى `profiling.tracing`. وبجانبه ظهر `profiling.sampling` القائم على أخذ العينات، وهو Tachyon. يلتقط هذا المحلل دوريًا مكدسات (stacks) العملية الجارية ويحسب أين يُصرف الوقت. والكلفة الإضافية منخفضة، ولا حاجة إلى تجهيز الشيفرة مسبقًا (instrumentation). وكان المطورون حتى الآن يثبّتون لهذا الغرض أدوات خارجية مثل py-spy. أما الآن فالوظيفة مدمجة في المكتبة القياسية.

في المثال الوارد في الملخص، جمع المحلل 2 651 عينة (sample) خلال 2.65 ثانية بمعدل نحو 1000 عينة في الثانية. وأوضح ما يظهر أن العملية قضت معظم وقتها في انتظار حلقة أحداث asyncio. ويمكن عرض النتيجة بصيغة flame graph وheat map، وكذلك بصيغة مخصصة لواجهة Firefox Profiler. وعلى macOS احتاج الاتصال بالعملية عبر PID إلى `sudo`.

السرعة: أثر JIT صار ملحوظًا أخيرًا

لا ينبغي توقع تسارع «مجاني». فقد قارن ميغيل غرينبرغ بين 3.15.0rc3 و3.14، ووجد أن الأداء ظل في الأساس على حاله. والاستثناء هو مترجم JIT التجريبي.

  • JIT مقابل المفسّر القياسي في 3.15: 1.2x في اختبار فيبوناتشي.
  • هذه أول مرة يرى فيها غرينبرغ تسارعًا ذا دلالة بفضل JIT.
  • للمقارنة: في العام الماضي تفوّق 3.14 بوضوح على 3.13 في عدد أكبر بكثير من الفئات.
  • محلل Tachyon: نحو 1000 عينة في الثانية، دون تجهيز مسبق للشيفرة (instrumentation).

كيفية الترقية وماذا يتيح التخلي عن 3.10

إذا كنت تعمل مع `uv`، فالانتقال لا يتطلب سوى بضعة أوامر. أولًا يجب تحديث الأداة نفسها كي تعرف بالإصدار الجديد: `uv self update`. ثم نثبّت المفسّر: `uv python install 3.15`. ولجعله الإصدار الافتراضي لأي `uv run` لم يثبّت فيه المشروع إصدارًا آخر، ننفذ `uv python pin --global 3.15`. وللتحقق: `uv run python --version`. أما الأدوات المثبّتة سابقًا فتُعاد تثبيتها بالإصدار المطلوب، مثلًا `uv tool upgrade datasette --python 3.15`.

أما الجانب الأكثر إثارة للمشرفين على المكتبات فهو الوجه الآخر للقصة. تقوم سياسة Willison على دعم جميع إصدارات Python الحيّة. وبما أن 3.10 لم يعد مدعومًا، يمكن الاعتماد على إمكانات 3.11:

  • `tomllib` في المكتبة القياسية؛
  • `asyncio.TaskGroup` و`asyncio.timeout()`؛
  • `datetime.UTC` كاسم بديل لـ `datetime.timezone.utc`؛
  • في `sqlite3`: `setlimit()`/`getlimit()` و`create_window_function()` و`blobopen()` للقراءة الجزئية لكائنات BLOB الكبيرة، و`set_authorizer(None)` لإزالة المفوِّض (authorizer)؛
  • نظام أنواع موسّع بوضوح.

في Datasette، يزيل أول PR (رقم 2998) الحل البديل الخاص بـ `set_authorizer(None)`. وصارت قوالب cookiecutter الخاصة بـ click-app وdatasette-plugin وpython-lib وllm-plugin تُختبر على الإصدارات من 3.11 إلى 3.15. والخلاصة العملية لمشروعك: راجع مصفوفة CI، واحذف 3.10، وأضف 3.15. ويُستحسن تجربة الاستيراد الكسول أولًا في أدوات CLI ذات الاعتماديات الثقيلة، فهناك يظهر الكسب في زمن البدء فورًا.

ZK
Hamidun News
أخبار الذكاء الاصطناعي بدون ضوضاء. اختيار تحريري يومي من أكثر من 50 مصدر. منتج من جمال حميدون، رئيس الذكاء الاصطناعي في Alpina Digital.
✦ Unified AI Workspace

Access Frontier LLMs & Multimodal AI in One Workspace

Discover NomadNet AI (nomadnet.ai) — unified access to frontier language models, research synthesis, and multimodal workflows.

Try NomadNet AI →Launch NomadNet Agent
ما رأيك؟
جارٍ تحميل التعليقات…