Get Mystery Box with random crypto!

جواب تا حالا تریس‌بک دیدید؟ خب معلومه! اما این چه ربطی به جوا | بنیاد پایتون کاران فارسی

جواب

تا حالا تریس‌بک دیدید؟ خب معلومه! اما این چه ربطی به جواب داره؟

اول بیاید یه تریس‌بک ببینیم:
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 هست:

https://github.com/python/cpython/blob/75a6441718dcbc65d993c9544e67e25bef120e82/Objects/unicodeobject.c#L10627

با یه حساب سر انگشتی:
اولی یه لیست و یه مپ و ۵۰۰ تا لامبدا و ۵۰۰ تا متد contains
و دومی یه لیست کامپری‌هنشن و یه زیپ و ۵۰۰ تا متد contains

و اگه موارد مشترک رو کم کنیم
اولی -> 502
دومی -> 2 تا

و این میشه که روش اول کندتر میشه


@pyfarsi