تقنية

غلاف vectorize: هل الاسم يثبت تنفيذًا أسرع؟

دالة بفرعين توضح أن شاهد الناتج الأول وتحديد النوع الصريح طريقان لقرار النوع.
رسم تحريري لمثال معلن، دون تشغيل نموذج أو جهاز.

غلاف vectorize ونوع الخرج سؤالان يظهران عند تجهيز بيانات لنموذج ذكاء اصطناعي. قد يتوقع القارئ أن الاسم يعني حسابا أسرع تلقائيا، بينما يصف NumPy الأداة بأنها للملاءمة، وتنفيذها في أساسه حلقة. [1] نركز على قراءة العقد، لا على سباق زمن.

الخلاصة السريعة

لا يكفي الاسم؛ يفصل التوثيق ملاءمة استعمال دالة على مصفوفة عن وعد الأداء، كما يجعل تعريف نوع الناتج جزءا من المراجعة.

  • vectorize في NumPy أداة ملاءمة أساسا، وليست وعد أداء؛ تنفيذها في أساسه حلقة. [1] لا نستخرج زمنا من الاسم.
  • نعلن دالة تعيد صفرا صحيحا عند صفر، وتعيد 0.5 عائما عند واحد. النواتج الخام نفسها تظهر بترتيبين؛ لا يشهد الناتج الأول وحده لنوع جميع النواتج.
  • يوثق NumPy استنتاج نوع الخرج من أول عنصر، ويمكن تجنب ذلك بتحديد otypes. [1] ترتيب يبدأ بصحيح يختلف في شاهد النوع عن ترتيب يبدأ بعائم؛ لا نعرض مخرجات مكتبة منفذة.
  • حدد قاعدة الدالة ونوع كل خرج وترتيب المدخلات، ثم تحقق عند التطبيق من التحويل والقيم والأداء؛ الإعلان عن نوع عائم لا يثبت صحة تجهيز النموذج أو سرعة التنفيذ.

ما الذي وعد به الغلاف فعلا؟

تقيم vectorize الدالة على عناصر متتابعة وفق قواعد البث، ويصرح المرجع أن هدفها الأساسي الملاءمة وأن التنفيذ في أساسه حلقة. [1]

قد تكون كتابة استدعاء واحد على قائمة أسهل في القراءة من كتابة الحلقة في كل موضع. لكن سهولة صياغة الاستدعاء لا تمنحنا آلية تنفيذ مختلفة لكل عملية، ولا تعطي نسبة تسريع أو توازيا على بطاقة رسومية.

نضعها في سياق تجهيز مدخلات الاستدلال: نراجع ما تفعله الدالة قبل إرسال القيم إلى النموذج. لا نستنتج أن كل حساب يحمل اسم «متجه» يستعمل النواة نفسها أو أن كل تحسين شكلي يحفظ القيم والنوع.

دالة صغيرة لها نوعان في نواتجها

نؤلف دالة عددية محدودة لمدخلين: عند صفر تعيد العدد الصحيح 0؛ وعند واحد تعيد العدد العائم 0.5. نحصر مجال الورقة في هذين المدخلين، ولا نخمن فرعا لقيمة ثالثة.

القائمة أ للمدخلات هي صفر ثم واحد؛ نواتج الدالة الخام فيها صفر صحيح ثم نصف عائم. القائمة ب هي واحد ثم صفر، فتصبح النواتج الخام نصفا عائما ثم صفرا صحيحا. تغير الترتيب، لكن كل قيمة ما زالت تخص مدخلها الأصلي.

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

أين يدخل تحديد نوع الخرج؟

يذكر NumPy أن النوع يستنتج من استدعاء الدالة على أول عنصر، ويمكن تجنب هذا الاستنتاج بتحديد otypes. [1]

لهذا نسجل أن الدالة قد تعيد نصفا، ولا نعامل الصفر الأول ضمانا لخلو بقية النواتج من الكسور. إذا كان غرضنا حفظ نواتج هذين الفرعين في نوع عائم مناسب، نعلن النوع بدلا من ترك هذا القرار لشاهد واحد.

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

كيف نجعل المراجعة قابلة للإعادة؟

احتفظ بتعريف الفرعين وترتيب المدخلات والنواتج الخام والنوع المطلوب. إذا وصل تقرير يذكر الاسم فقط، فلا نملأه بزمن تنفيذ أو نتيجة تحويل أو بطاقة رسومية لم يقدم دليلا عنها.

وعند مقارنة طريقتين لاحقا، افصل سؤال تساوي القيم عن سؤال الزمن. تتطلب المقارنة المدخلات نفسها والقواعد نفسها وتعريفا لما يدخل التوقيت؛ لا يصلح تحسن صياغة الشفرة برهانا على تحسن تنبؤ النموذج.

الرسم ينتقل من دالة معلنة إلى ناتج أول ثم قرار نوع الخرج. لم نشغل NumPy أو نقس أداء. فائدته أن يجعل الاسم وتعريف الدالة وعقد النوع ثلاثة أشياء ظاهرة، بدل تلخيصها كلها في كلمة «تسريع».

المصادر ومتابعة القراءة

  1. NumPy: numpy.vectorize (يفتح في نافذة جديدة)numpy.org

أُعدّ هذا المقال بصياغة عربية أصلية بالاستناد إلى المصادر أعلاه، وهو مدخل تمهيدي إلى الموضوع. اقرأ منهجية المحتوى وحدوده.