جواب تا حالا تریسبک دیدید؟ خب معلومه! اما این چه ربطی به جوا | بنیاد پایتون کاران فارسی
جواب
تا حالا تریسبک دیدید؟ خب معلومه! اما این چه ربطی به جواب داره؟
اول بیاید یه تریسبک ببینیم: Traceback (most recent call last): File "/.../fields.py", line 241, in set inst.data[self.name] = self.validator.validate(value) File "/.../fields.py", line 662, in validate raise ValidationError(messages=error_messages) typesystem.base.ValidationError: {0: 'Must be a string.', 1: 'Must be a string.'}
هر یه دونه خطی که نوشته فلان فایل و کجا و یه خطی ازش آورده، چیزیه به اسم frame object. هر تابعی که صدا زده میشه، توی call stack عه پایتون، یه فریم آبجکت درست میشه که استک مورد نیاز و دیکشنری ()locals عه اون و مقداری که ازش باید return بشه یا exception عی که باید ازش propagate بشه رو مدیریت میکنه، و تابع اون تو ران میشه.
یعنی return کار میکنه چون فریم آبجکت وجود داره و اون این کار رو برامون انجام میده.
وقتی پایتون یه مقداری رو به فریم دیگه ریترن میکنه، اون فریم باید از بین بره و gc و پایتون اینجا درگیرن، بساز خراب کن بساز خراب کن (که این توی توابع recursive اندکی فرق میکنه، هی فریم ساخته میشه روی هم توی استک و بعدش دونه دونه خراب میشن)
از اون طرف صدا زده شدن تابع و همین ساخته شدن فریم و اینا تبعا یه overhead عی داره و اصطلاحا function call، اندکی توی پایتون expensive هست (که البته توی پایتون ۳.۱۱ خیلی بهتر شده و تا ۳.۱۵ خیلی بهتر میشه)
روش اولی که توی صورت سوال هست، اگه گفتید چند تا تابع داره؟ 1. list 2. map + 500 lambda
یعنی ۵۰۲ تا فانکشن کال رو فقط ما داریم میبینیم.
این همهههههههه فانکشن کال اتفاق میوفته
اما روش دوم
ما دو تا تابع میبینیم: 1. listcomp 2. zip (اگه نمیدونستید باید بگم که لیست کامپریهنشن ها به یه تابع تبدیل میشن.)
توابعی هم که ما نمیبینیم، در جفت مثالها داندر contains (اونجایی که l in w داریم) صدا زده میشه که، این تابع C هست: