✅کانال اطلاع رسانی انجمن علمی مهندسی کامپیوتر دانشگاه مازندران
📌 ارتباط با دبیر:
@Zabihi_Mahdi
📌 📷Instagram:
UMZ_Computer
Post #336
780
🟢 پیادهسازی تابع داخلی len در پایتون:
💻 پایتون یه زبان سطح بالا است، ولی خیلی از توابع داخلیش با C نوشته شدن تا سرعت و کارایی بیشتری داشته باشه. یکی از این توابع پرکاربرد، تابع len() هست که تعداد آیتمهای داخل یه شیء مثل لیست، رشته یا تاپل رو به ما میده. حالا میخواهیم ببینیم چطور این تابع در CPython (نسخه اصلی پایتون) پیادهسازی شده.
⌨️ پیادهسازی در C:
در CPython، تابع len() به زبان C نوشته شده و توی فایل Objects/abstract.c قرار داره. این تابع اول نوع شیء رو بررسی میکنه و بعد طولش رو محاسبه میکنه. اینجا یه نسخه سادهشده از کد C رو میبینیم:
🔺بررسی PyObject_Length: وقتی از تابع len() در پایتون استفاده میکنیم، در واقع این تابع C از طرف CPython اجرا میشه.
🔺بررسی NULL: اول از همه، چک میکنه که شیء ورودی v مقدار NULL نداشته باشه. اگه داشته باشه، یه خطا به نام BadInternalCall ایجاد میشه.
🔺بررسی قابلیت طولگیری: بعد تابع بررسی میکنه که آیا شیء ویژگی tp_as_sequence رو داره یا نه. این ویژگی تابعی به اسم sq_length داره که مسئول محاسبه طول شیء است. اگه این ویژگی باشه، تابع sq_length برای محاسبه طول فراخوانی میشه.
🔺برگشت نتیجه: در آخر، نتیجه طول محاسبهشده با استفاده از PyLong_FromLong به یه شیء Python تبدیل میشه و برمیگرده.
🔺خطای نوع: اگه شیء نتونه طول داشته باشه (مثل NoneType)، یه خطای TypeError ایجاد میشه.
✅ این پیادهسازی در C باعث میشه که تابع len() سریعتر و کارآمدتر اجرا بشه. پایتون با استفاده از C برای توابع داخلی، هم راحتی و سادگی کار با توابع رو حفظ کرده و هم عملکرد بهتری رو فراهم میکنه.
🔗 @umz_computer
💻 پایتون یه زبان سطح بالا است، ولی خیلی از توابع داخلیش با C نوشته شدن تا سرعت و کارایی بیشتری داشته باشه. یکی از این توابع پرکاربرد، تابع len() هست که تعداد آیتمهای داخل یه شیء مثل لیست، رشته یا تاپل رو به ما میده. حالا میخواهیم ببینیم چطور این تابع در CPython (نسخه اصلی پایتون) پیادهسازی شده.
my_list = [1, 2, 3, 4, 5]
print(len(my_list)) # خروجی: 5
⌨️ پیادهسازی در C:
در CPython، تابع len() به زبان C نوشته شده و توی فایل Objects/abstract.c قرار داره. این تابع اول نوع شیء رو بررسی میکنه و بعد طولش رو محاسبه میکنه. اینجا یه نسخه سادهشده از کد C رو میبینیم:
#include <Python.h>
PyObject* PyObject_Length(PyObject *v)
{
if (v == NULL) {
PyErr_BadInternalCall();
return NULL;
}
if (Py_TYPE(v)->tp_as_sequence != NULL &&
Py_TYPE(v)->tp_as_sequence->sq_length != NULL) {
return PyLong_FromLong(Py_TYPE(v)->tp_as_sequence->sq_length(v));
}
PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
return NULL;
}
🔺بررسی PyObject_Length: وقتی از تابع len() در پایتون استفاده میکنیم، در واقع این تابع C از طرف CPython اجرا میشه.
🔺بررسی NULL: اول از همه، چک میکنه که شیء ورودی v مقدار NULL نداشته باشه. اگه داشته باشه، یه خطا به نام BadInternalCall ایجاد میشه.
🔺بررسی قابلیت طولگیری: بعد تابع بررسی میکنه که آیا شیء ویژگی tp_as_sequence رو داره یا نه. این ویژگی تابعی به اسم sq_length داره که مسئول محاسبه طول شیء است. اگه این ویژگی باشه، تابع sq_length برای محاسبه طول فراخوانی میشه.
🔺برگشت نتیجه: در آخر، نتیجه طول محاسبهشده با استفاده از PyLong_FromLong به یه شیء Python تبدیل میشه و برمیگرده.
🔺خطای نوع: اگه شیء نتونه طول داشته باشه (مثل NoneType)، یه خطای TypeError ایجاد میشه.
✅ این پیادهسازی در C باعث میشه که تابع len() سریعتر و کارآمدتر اجرا بشه. پایتون با استفاده از C برای توابع داخلی، هم راحتی و سادگی کار با توابع رو حفظ کرده و هم عملکرد بهتری رو فراهم میکنه.
🔗 @umz_computer
- 👍 5
- 🔥 4
- ❤ 3












