تسريع الحوسبة المعقدة مع الحد الأدنى من الحمل RAM

في عملية إتقان ML ، CNN ، NN في Python ، يواجه المبتدئ دائمًا مشكلة سرعة الحساب ، وأحيانًا نقص ذاكرة الوصول العشوائي.

هذا هو ملحوظ بشكل خاص مع قواعد البيانات الكبيرة ، التي أكبر من 50 ٪ من ذاكرة الوصول العشوائي الحرة في الحجم. الأفكار حول شراء المزيد من الحديد اللائق ليست سوى واحدة من الحلول الممكنة.

هناك خيار آخر لاستخدام إحدى الميزات في Python وهو التكرار على الوظيفة نفسها.

مثال بسيط وتوضيحي. افترض أنك بحاجة إلى إنشاء سلسلة من 200000 درجة من الأرقام من 1 إلى 10 وإضافة مجموعها. نتيجة لذلك ، يجب أن تحصل على رقم يبلغ طوله 200 ألف حرف. انها 2 مرات أكثر من جوجل )

إليك رمز بسيط لمثل هذه الوظيفة:

from time import time #    #      def power_1(x): power_1 = 0 start = time() power_1 = x**200000 end = time() total_1 = end - start return round(total_1,6) #   ,         power_1(1) + power_1(2) + power_1(3) + power_1(4) + power_1(5) + power_1(6) + power_1(7) + power_1(8) \ + power_1(9) + power_1(10) 

نتيجة لذلك ، حصلنا على عملية "مكلفة" إلى حد ما للكمبيوتر الخاص بك ، وعلى سبيل المثال ، يستغرق الأمر أكثر من 13 مللي ثانية بالنسبة لي. ولكن ماذا لو كان هناك الكثير من هذه العمليات؟ ثم يصبح كل شيء معقدًا ، وربما ليس لديك ذاكرة RAM كافية.

ولكن يمكنك أن تكون أكثر تعقيدًا وتستخدم نفس الوظيفة بالضبط عن طريق تشغيل التكرار من خلال المتغيرات الخاصة بك.

هنا هو رمز لمثل هذا الحل البسيط ، من نفس الوظيفة:

 from time import time #   #   def power_2(): for i in range(11): yield i #     for i in power_2(): if i < 11: d = 0 total_2 = 0 start = time() d += i**200000 end = time() total_2 += end - start print('Ineration {} lasts {}'.format(i, round(total_2, 6))) if i == 10: print(' \n End with total time {} \n'.format(round(total_2,3))) 

الوقت الذي يقضيه على جهاز الكمبيوتر الخاص بي



الفرق هو 0.13 - 0.024 = 0.106 مللي ثانية!


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

 def add_one(x): total_3 = 0 start = time() s = x + 1 end = time() total_3 += end - start print('Time to do add 1 to BIG number: {} \n'.format(total_3)) return print('Difference in time {}\n'.format(round(total_2 - total_3 ,3))) add_one(d) print('The size of the number {}!!!'.format(len(str(d)))) 

والنتيجة هي هذه:



لماذا هذا حسب علمي ، عند التكرار على دالة ، لا يقوم Python بإنشاء كائنات مؤقتة في الذاكرة ، والتي بدورها تسرع أي عملية حسابية بشكل كبير. لذلك ، إعادة كتابة الوظيفة بهذه الطريقة - يمكنك توفير الوقت والأعصاب.

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

آمل أن يساعد هذا الشخص على عدم فقد دقائق ثمينة أو عدم الإنفاق على أجهزة إضافية سريعة التقدم في السن.

مستوحاة من محاضرة

Source: https://habr.com/ru/post/ar439312/


All Articles