أنجز العمل مرة واحدة وكن قادرًا على إثباته
البحث يكرر نفسه: الشبكة نفسها من الإعدادات على الطيات نفسها وجدول المتغيرات نفسه يُعاد بناؤه في كل تجربة. يزيل joblib هذا الهدر. تشغّل Parallel(n_jobs=k)(delayed(f)(x) for x in items) الاستدعاءات المستقلة f(x) على k عاملًا وتعيد النتائج بترتيب العناصر؛ وn_jobs=-1 يستخدم كل الأنوية وn_jobs=1 يشغلها واحدًا بعد الآخر وهو ما يفعله المتصفح. ويجب أن تفوق كلفة المهمة كلفة إرسال بياناتها إلى عامل فجمّع المهام الصغيرة جدًا. والبحث الشبكي مثال مثالي: 5 قيم alpha في 5 طيات متحركة هي 25 ملاءمة مستقلة ولا تعتمد الإجابة على عدد العمال الذين شغّلوها.
تلفّ Memory(location).cache(f) الدالة f بذاكرة تخزين مؤقت على القرص. أول استدعاء بوسائط معينة يشغّل f ويخزّن النتيجة تحت تجزئة الوسائط؛ والاستدعاء التالي بالوسائط نفسها يقرأ الملف. تبقى الذاكرة بعد انتهاء البرنامج وتلاحظ تغيّر f أو أحد الوسائط. جزّئ مصفوفات NumPy لا الـDataFrame: قد تعتمد تجزئة الجدول على تخطيطه الداخلي في الذاكرة فيختلف تجزئتا جدولين متساويي المحتوى ثم تخطئ الذاكرة. وjoblib.hash(array) بصمة للمحتوى: متساوية للنسخة ومختلفة بعد أي تغيير وبها تثبت أن تجربتين استخدمتا البيانات نفسها. وأخيرًا تكتب joblib.dump(model, path, compress=3) نموذجًا مُلاءَمًا في ملف مضغوط وتعيد joblib.load(path) كائنًا يتنبأ بالضبط نفسه. في المختبر تعطي 25 مهمة ارتباطات رتب متحركة ضمن 0.06 من الصفر عند كل alpha وتعمل slow_features مرة واحدة لاستدعاءين مخزّنين ويتنبأ Ridge المعاد تحميله بالمثل تمامًا.
- المهام المستقلة تمر عبر
Parallelوdelayed؛ ويجب ألا تعتمد الإجابة علىn_jobs. Memory.cacheيخزّن النتائج على القرص بمفتاح هو تجزئة الوسائط؛ مرّر مصفوفات لا جداول.joblib.hashيثبت أن تشغيلين استخدما البيانات نفسها؛ وdumpوloadيحفظان نموذجًا يتنبأ بالمثل.
المختبر: ما الذي يُقيَّم
- مهمة طية واحدة15 نقطة
- شبكة المهام25 نقطة
- ذاكرة القرص15 نقطة
- البصمة10 نقطة
- حفظ نموذج15 نقطة
- الدراسة20 نقطة