+− THE DAILY DIFFdev & AI news
SHIP IT

".أداء بايثون: حلقات NumPy الأصلية، ردود الاتصال، وتكاليف التحويل"

يُتبع اختبار عددي متحكم فيه يعتمد على وحدة المعالجة المركزية فقط قيمًا متطابقة عبر حلقات CPython، وعمليات NumPy الحسابية، و wrapper رد اتصال بايثون، وحلقة Numba مجمعة.

Want to see our stories first on Google? Add us to your preferred sources — it helps us grow.

يُتبع اختبار عددي متحكم فيه يعتمد على وحدة المعالجة المركزية فقط قيمًا متطابقة عبر حلقات CPython، وعمليات NumPy الحسابية، و wrapper رد اتصال بايثون، وحلقة Numba مجمعة. كانت NumPy الجاهزة للإدخال متقدمة بفارق كبير، بينما قلل التحويل من وإلى قوائم بايثون هذه الميزة إلى تعادل شبه تام. تشرح الحلقة حدود التنفيذ وكيفية قياس النتيجة التي يحتاجها التطبيق.

اقرأ النسخة المكتوبة (الإنجليزية) ↗

ما يغطيه هذا الفيديو

  • CPython يترجم الكود المصدري إلى bytecode. العمل المتكرر للمفسر/الكائنات وحلقة عددية أصلية ذات أنواع محددة هي ترتيبات تنفيذ مختلفة.
  • يمكن لعمليات NumPy الحسابية الرقمية تسليم مجموعات مُصنفة إلى عمليات مجمعة؛ لا تزال حلقة العمليات الحسابية موجودة، ويمكن أن تحتوي العروض على تخطيطات غير متجاورة.
  • قم بقياس تكاليف التحويل وتمثيل الإخراج المطلوب. في هذه التجربة، أدى تحويل قوائم بايثون إلى مصفوفات والعكس إلى محو الفارق الكبير الذي كانت تتمتع به المصفوفات الجاهزة.
  • أعباء العمل الصغيرة يمكن أن تفضل بايثون العادي لأن تكاليف استدعاء المصفوفة الثابتة مهمة. في هذه المقارنة المقاسة، فاز الفهم المكون من ثماني قيم.
  • np.vectorize هو "wrapper" ملائم يستدعي بايثون للعناصر المتتالية؛ واجهة الدفعة وحدها لا تؤسس تنفيذًا عدديًا أصليًا.
  • يمكن أن تكون حلقات بايثون المترجمة سريعة أيضًا. قم بتضمين تكاليف التجميع/الإعداد الباردة عندما تكون مهمة للمتصل.
  • التنفيذ الأصلي، و CPU SIMD، وتعدد الخيوط، وخلفيات GPU هي أفكار منفصلة. ميزات CPU المتاحة لا تتبع التعليمات المستخدمة في تشغيل معين.

النص المترجم

مترجم من السرد الإنجليزي الأصلي. يتم التحكم في الصوت والتعليقات التوضيحية المتاحة بواسطة YouTube.

لماذا يمكن لنفس وحدة المعالجة المركزية أن تنهي العمل بشكل أسرع؟

0:00 أنت تعتقد أن بايثون تحتاج إلى لغة جديدة لتصبح سريعة. نفس وحدة المعالجة المركزية قامت بتشغيل دفعتنا بشكل أسرع بعد نقل الحلقة. أين ذهب العمل؟ متى يختفي التسريع؟ أي اختصار يعيد بايثون؟ هذا هو The Daily Diff، تحت الغطاء. راقب هذا الاختصار. CPython هو تطبيق بايثون القياسي.

0:17 يقوم بتجميع الكود المصدري الخاص بك إلى بايت كود، ثم يقوم بتشغيل هذه التعليمات في مفسر. NumPy هي مكتبة عددية تحمل مصفوفاتها قيمًا ذات نوع بيانات معلن. يمكن لعملياتها الحسابية المدمجة تسليم دفعة كاملة لعمليات مجمعة. خذ مليون قيمة عشرية، ربع كل واحدة، ثم أضف القيمة الأصلية. تحصل كل نسخة على قيم متطابقة وتنتج إجابات متطابقة. القيم صغيرة بما يكفي لإبقاء فروقات التقريب خارج المنافسة.

0:40 على هذه الآلة، استغرق الفهم حوالي ثلاثة وثلاثين مللي ثانية. استغرقت NumPy أقل من واحدة. كلاهما يعمل على وحدة المعالجة المركزية. هذا دليل مفيد لعبء العمل هذا، ونعي فظيع لـ لغة برمجة. لنبدأ بالحلقة العادية.

ما العمل الذي تكرره حلقة بايثون؟

0:53 تحصل بايثون على القيمة التالية، وتجري العملية الحسابية، وتلحق الإجابة. ثم تفعل ذلك مرة أخرى. الضرب غير مكلف. ترتيب عملية الضرب التالية، والتعامل مع كائنات بايثون المحيطة بها، يضيف عملاً في كل مرة. هذا هو التفكيك الفعلي للدالة المختبرة. تظهر عمليات التكرار والضرب والجمع كتعليمات بايت كود. تتخذ إصدارات ومفسرات بايثون خيارات مختلفة.

1:14 هذه التوقيتات تنتمي إلى الإصدار المعروض على الشاشة، وهو بايثون ثلاثة نقطة عشرة. قائمة بايثون تخزن مراجع للكائنات، لذا يمكن أنواع مختلفة من الأشياء أن تشارك قائمة. تستخدم مهمتنا الحسابية أرقامًا في كل مكان. إنها تدفع مقابل ترتيب عام بينما تطلب خدمة متكررة. تخيل أنك تطلب نفس القهوة مليون مرة وتملأ نموذجًا جديدًا لكل كوب. آلة القهوة بخير.

1:36 الأعمال الورقية طورت مسيرتها الخاصة.

أين تنقل NumPy الحلقة؟

1:38 NumPy تغير العقد. تحتوي هذه المصفوفة على قيم عائمة ثابتة الحجم بنوع واحد معلن. مصفوفنا متجاور، لذا تقع قيمه معًا في الذاكرة. يمكن أن تحتوي العروض على تخطيطات أخرى. تعرف العملية الحسابية نوع البيانات التي تتلقاها. ينقل الاستدعاء الدفعة إلى عملية أصلية. لا تزال حلقة تزور القيم داخل الكود المترجم. يمكنها إعادة استخدام المعرفة بالنوع عبر هذا العمل.

2:00 بايثون يبقى الشخص الذي يسلم المهمة. يشرح إيتامار تيرنر تراورنغ هذا التمييز في "سرعة بايثون". واجهات الدفعات، والتطبيقات الأصلية، وتعليمات معالجة المتجهات هي أمور منفصلة. اسم الوظيفة لا يقدم سوى القليل جدًا من الأدلة.

هل السرعة تعني GPU أم العديد من أنوية CPU؟

2:13 هذه النتيجة استخدمت NumPy على وحدة المعالجة المركزية. تختار خلفية GPU مثل CuPy مكانًا مختلفًا للمصفوفات والعمليات. شراء وحدة معالجة رسومات يترك حلقة بايثون العادية هذه تعمل حيث كانت تعمل بالفعل. يمكن لتعليمات متجهات وحدة المعالجة المركزية معالجة عدة قيم معًا. تتمتع NumPy بآلية لاختيار النوى المدعومة. يبلغ وقت التشغيل الخاص بنا عن الميزات المتاحة، ولكنه لا يتتبع تعليمات هذا التعبير. إن إعطاء المكسب المقاس بالكامل لتعليمات المتجهات سيكون مبالغة في الأدلة.

2:40 عربة التسوق الخاصة بوحدة معالجة الرسوميات يمكن أن تبقى مغلقة. هناك شيء مُرضٍ للغاية في حل مشكلة الأداء الذي يلغي أيضًا عملية شراء. لسوء الحظ، يستمر المعيار.

متى تختفي السرعة المذهلة؟

2:49 مع ثماني قيم، فاز الفهم. كلف استدعاء آلية المصفوفة أكثر من المهمة الصغيرة. المصفوفات الجاهزة الأكبر حجمًا تقدمت. استخدمنا تجارب متكررة وعملية مُحفَّزة. يمكن أن تغير إصدارات بايثون الأحدث نقطة التعادل. ثم غير ما يحتاجه التطبيق. ابدأ بقائمة بايثون وانتهِ بقائمة بايثون جديدة. يجب على NumPy تحويل المدخلات إلى مصفوفة وتحويل الإجابة مرة أخرى إلى كائنات بايثون.

3:11 هذه الخطوات يجب أن تُدرج في الفاتورة إذا كان تطبيقك يحتاجها. عند مليون قيمة، استغرق هذا المسار الكامل حوالي ثمانية وعشرين مللي ثانية. استغرق الفهم حوالي ثمانية وعشرين أيضًا. أصبح تقدمنا الدرامي تعادلًا شبه كامل. الجزء السريع كان حقيقيًا. الميزة تعتمد على ترك البيانات في شكلها الرقمي.

ما هي الحدود التي يجب تضمينها في المعيار؟

3:28 اتبع البيانات. إذا كانت العملية التالية تقبل مصفوفة، فاحتفظ بالمصفوفة. إذا كنت تحول بشكل متكرر بين القوائم والمصفوفات، قم بقياس تلك التحولات. التوقف قبل تسليم مكلف يعطي أرقامًا دقيقة للسؤال الخطأ. ضرب هذه المصفوفة ينشئ نتيجة مؤقتة. إضافة القيم الأصلية تنشئ الإخراج. لا يزال التنفيذ الأصلي يحتاج إلى الذاكرة وينقل البيانات.

3:47 تقبل بعض العمليات مخزنًا مؤقتًا للإخراج، مما يقلل من التخصيصات عندما يمكن للكود الخاص بك إعادة استخدامه بأمان. سطر واحد جميل يمكن أن يطلب عدة مخازن مؤقتة كبيرة. يشير "بايثون سبيد" إلى هذه المشكلة أيضًا. المخصص غير مبالٍ بشكل ملحوظ بجمالياتك.

هل يمكن لحلقة بايثون المترجمة أن تكون سريعة أيضًا؟

4:00 يمكنك أيضًا الاحتفاظ ببناء حلقة وتغيير طريقة تنفيذها. يمكن لـ Numba تجميع وظائف بايثون الرقمية المدعومة إلى كود أصلي. هذه هي الحلقة من اختبارنا مع مزين المترجم الخاص بها. لا يزال يقول "for" (لـ). لقد تغير مسار المفسر المكلف. بعد التجميع، استغرقت هذه الحلقة أقل من نصف مللي ثانية مع المصفوفات الجاهزة. استغرق التجميع نفسه حوالي ثانية في هذا التشغيل. تم استبعاد تكلفة الإعداد هذه من التوقيتات المتكررة،

4:22 لذا فإن مهمة صغيرة لمرة واحدة تستحق مقارنة مختلفة. دليل Numba الخاص سعيد بإظهار الحلقات الصريحة. بدء ترحيل لغة قبل العثور على المسار الساخن هو طريقة معقدة لـ تجنب فتح أداة تحليل الأداء. أولاً، ابحث عن ما يستهلك الوقت. انتظارات الشبكة، وتحليل الكائنات، والحسابات الجماعية تتطلب حلولًا مختلفة. تساعد عمليات المصفوفات الأصلية عندما تتناسب الحسابات والبيانات.

4:43 قم بقياس النتيجة التي يحتاجها المتصل فعلاً. الآن لهذا الاختصار. لديك دالة بايثون وتريدها أن تقبل مصفوفة. يبدو "wrapper" يسمى vectorize وكأنه زر الأداء المفقود. وثائقه تحتوي على جملة مهمة تنتظر.

ماذا ينفذ np.vectorize فعليًا؟

4:56 تقول NumPy أن "wrapper" الـ vectorize الخاص بها مقدم بشكل أساسي للراحة. تطبيقه هو في الأساس حلقة تكرارية (for loop). يقبل الـ wrapper الدفعات، لكنه يستمر في استدعاء دالة بايثون الخاصة بك للعناصر المتتالية. أصبحت الواجهة أقصر. ظل حد التنفيذ مشغولاً. شاهد نفس القيم تعود عبر رد الاتصال في بايثون. مع المصفوفات الجاهزة، استغرق هذا الإصدار حوالي سبعة وثمانين مللي ثانية. كان أبطأ من فهمنا.

5:18 يمكن لـ "wrapper" البث المفيد أن يحافظ على العمل الدقيق لكل عنصر الذي كنت تحاول إزالته. تحقق من التنفيذ وراء واجهة الدفعة، واحتفظ بالبيانات المتوافقة في شكلها المفيد، وقم بتضمين التحويل في المقارنة. يمكن أن تبدو الحلقات الأصلية، وحلقات رد الاتصال، والحلقات المجمعة متشابهة من منظور المتصل. اسم "vectorize" قدّم وعدًا لم توقعه ساعتك اليدوية أبدًا. احتفظ به عندما تكون الراحة هي ما تحتاجه. لتحقيق الأداء، تحقق من الحلقة التي تعمل.

ماذا يجب أن تغير في كودك؟

5:41 حكمي هو SHIP IT لتجميع مسار عددي ساخن مُقاس. احتفظ بالحلقات العادية عندما تعمل بشكل جيد بالفعل. تحقق أين يحدث العمل وماذا يحتاجه المتصل التالي. اشترك، اضغط على زر الجرس، وأخبرني في التعليقات إذا كنت قد ختمتها بشكل مختلف. وهذا هو الفرق لهذا اليوم. أنا نيكو من Axrisi. ادمج بمسؤولية.

المصادر

  1. Universal functions (ufunc) basics — NumPy 2.2NumPy
  2. The N-dimensional array — NumPy 2.2NumPy
  3. numpy.vectorize — convenience and performance notesNumPy
  4. CPU/SIMD optimizations — NumPy 2.2NumPy
  5. dis — Disassembler for Python bytecodePython Software Foundation
  6. CPython 3.10.12 list representationCPython contributors
  7. The limits of Python vectorization as a performance techniqueItamar Turner-Trauring / Python⇒Speed
  8. Performance TipsNumba
  9. Basics of CuPyCuPy

فيديوهات ذات صلة

under-the-hood · ar · 12‏/10‏/2026

ملفات نموذج Hugging Face يمكنها تشغيل تعليمات برمجية مخفية

يمكن لحزم النماذج الضارة تنفيذ تعليمات برمجية أثناء التحميل غير الآمن. تشرح ثلاثة أمثلة موثقة قذائف Pickle العكسية، وسلوك ماسح الملفات المعطلة، والارتباك في أسماء النماذج الذي تم إثباته بحثيًا، مع قيو

3:33 ↗