Get Mystery Box with random crypto!

Constant folding: فرض کنید قرار هست تا یک فانکشن بنویسیم تا ب | بنیاد پایتون کاران فارسی

Constant folding:

فرض کنید قرار هست تا یک فانکشن بنویسیم تا به ما تعداد ثانیه های موجود در یکسال رو بده. به سه شکل میتونیم بنویسیم:
def fn1():
days = 365
hours = 24
minutes = 60
seconds = 60
return days * hours * minutes * seconds

def fn2():
return 365 * 24 * 60 * 60

def fn3():
return 31536000

اینا چه فرق هایی باهم دارن ؟
از نظر خوانایی :‌
تو فانکشن fn1 کاملا مشخص هست که اون عدد ها چین از کجا اومدن ، خروجی چی هست... تو fn2 میشه یه حدس هایی زد که خروجی ما حاصل ضرب چه عدد هایی بوده توی فانکشن سوم هیچ نظری نمیشه داد که اون عدد چیه.

از نظر performance چی؟
اگه با واژه ی constant folding آشنا نبوده باشید احتمالا حدس میزنید که به همون میزان که از خوانایی داره کم میشه،‌ به سرعت داره اضافه میشه. ولی توی runtime اینطور نیست:

پایتون زمانی که داره کد شمارو compile میکنه یه سری optimization های ریز انجام میده مثلا وقتی به عبارت :
365 * 24 * 60 * 60
میرسه میدونه که این ۴ تا مقادیر ثابت هستن نمیشه که تغییر پیدا کنن پس میگه دلیلی نداره من هربار که fn2 رو کسی کال کرد بیام این ۴ تا عدد رو تو هم ضرب کنم و حاصل رو برگردونم. من میام یه بار حاصلش رو حساب میکنم و به جای اون عبارت قرارش میدم.

پس زمانی که کد شما compile شد دیگه "حاصل" اون عبارت که 31536000 باشه برمیگرده موقع کال کردن و دقیقا انگار که fn3 رو کال کرده باشید.

توی اولی ولی اینطور نیست. هربار که شما فانکشن fn1 رو کال کنید پایتون اول میاد ۳۶۵ رو میگیره ذخیره میکنه تو days بعد ۲۴ رو میگیره ذخیره میکنه تو hours همینطور تا انتها... خط آخر هم میاد days و hours و minutes و seconds رو از local variable ها میگیره و تو هم ضرب میکنه و حاصل رو برمیگردونه.

و در آخر فقط زمانی باید performance براتون مهم باشه که کدتون رو profile کردین و دیدین سرعت پایین فلان بخش از کد داره تاثیر جدی میذاره و بودن یا نبودن فلان عنصر تفاوت قابل توجهی داره ایجاد میکنه. شاید مثال خیلی خوبی نبود صرفا هدف گفتن constant folding بود چون با کامنت گذاری و docstring خوانایی کد رو به راحتی میتونید بالا ببرید. (در ضمن comment ها توی پروسه compile کاملا ignore میشن.) اگه خواستید docstring ها رو هم موقع compile نادیده بگیره پایتون:
python -OO your_file.py

@PSFarsi