سؤال

أنا أقوم بتكرار جزء صغير من نموذج محاكاة وكيل Sugarscape في Python 3. لقد اكتشفت أن أداء الكود الخاص بي أبطأ بثلاث مرات من أداء NetLogo. هل من المحتمل أن تكون المشكلة في الكود الخاص بي ، أم يمكن أن تكون قيودًا متأصلة في Python؟

من الواضح أن هذا مجرد جزء من الكود ، ولكن هذا هو المكان الذي تقضي فيه Python ثلثي وقت التشغيل. آمل إذا كتبت شيئًا غير فعال حقًا ، فقد يظهر في هذا الجزء: Genacodicetagpre

مكافئ تقريبًا رمز في NetLogo (هذا الجزء يعمل أكثر قليلاً من وظيفة Python أعلاه) :

Genacodicetagpre

على جهاز الكمبيوتر الخاص بي ، تستغرق شفرة Python 15.5 ثانية لتشغيل 1000 خطوة ؛ على نفس الكمبيوتر المحمول ، تنتهي محاكاة NetLogo التي تعمل بجافا داخل المتصفح 1000 خطوة في أقل من 6 ثوانٍ.

تحرير: تحقق فقط من Repast ، باستخدام تنفيذ Java. وهو أيضًا مشابه تمامًا لـ NetLogo عند 5.4 ثانية. تشير المقارنات الأخيرة بين Java و Python إلى عدم وجود ميزة لجافا ، لذلك أعتقد أن اللوم هو فقط الكود الخاص بي؟

تحرير: أدرك أن MASON من المفترض أن تكون أسرع من Repast ، ومع ذلك فإنه لا يزال يدير Java في النهاية.

هل كانت مفيدة؟

المحلول

ربما لن يؤدي هذا إلى تسريع كبير ، ولكن يجب أن تدرك أن المتغيرات المحلية أسرع قليلاً في Python مقارنة بالوصول إلى globals أو السمات.لذا يمكنك محاولة تعيين بعض القيم المستخدمة في الحلقة الداخلية للسكان المحليين ، على النحو التالي: Genacodicetagpre

تتمتع استدعاءات الوظائف في Python أيضًا بنفقات عامة عالية نسبيًا (مقارنة بجافا) ، لذا يمكنك محاولة إجراء مزيد من التحسين عن طريق استبدال وظيفة الترميز العام بالبحث المباشر في القاموس.

يجب أيضًا إلقاء نظرة على psyco .إنه مترجم في الوقت المناسب لـ Python يمكنه تحسين السرعة بشكل كبير في بعض الحالات.ومع ذلك ، فهو لا يدعم Python 3.x حتى الآن ، لذلك ستحتاج إلى استخدام إصدار أقدم من Python.

نصائح أخرى

سأخمن أن الطريقة التي يتم بها تنفيذ رمز الترميز العام في NetLogo تختلف عن الحلقة المزدوجة التي لديك.على وجه التحديد ، أعتقد أنهم يحسبون مسبقًا متجهًا حيًا مثل Genacodicetagpre

(ستحتاج إلى حلقة مختلفة للرؤية= 1،2 ، ...) ثم استخدم حلقة واحدة فقط فوق رمز الترقيم العام بدلاً من حلقة متداخلة كما تفعل.هذا يلغي الحاجة إلى المضاعفات.

لا أعتقد أن هذا سيجعلك تسريع 3X

هذا سؤال قديم ، لكنني أقترح أن تنظر في استخدام NumPy لتسريع عملياتك.الأماكن التي تستخدم فيها الإملاءات والقوائم المنظمة منطقيًا (1 أو 2 أو 3 أو N-الأبعاد شبكة) كائن بيانات متجانس (جميع الأعداد الصحيحة ، أو جميع العوامات ، إلخ) سيكون لها مقدار حمل أقل عند تمثيلها والوصول إليها على أنها Numpyالمصفوفات.

http://numpy.org

فيما يلي مقارنة محدثة نسبيًا بين NetLogo وإصدار واحد من Repast.لن أفترض بالضرورة أن Repast أسرع.يبدو أن NetLogo يحتوي على بعض الخوارزميات الذكية جدًا التي يمكن أن تعوض أي تكاليف لها. http://condor.depaul.edu/slytinen/abm/Lytinen-Railsback-EMCSR_2012-02-17.pdf

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top