【发布时间】:2019-05-28 00:38:01
【问题描述】:
当我遇到 len 函数的 C 实现时,我正在阅读有关 python 内置函数的实现
static PyObject *
builtin_len(PyObject *module, PyObject *obj)
/*[clinic end generated code: output=fa7a270d314dfb6c input=bc55598da9e9c9b5]*/
{
Py_ssize_t res;
res = PyObject_Size(obj);
if (res < 0) {
assert(PyErr_Occurred());
return NULL;
}
return PyLong_FromSsize_t(res);
我无法理解这段代码中发生了什么。我不知道 C 是如何工作的。有人能解释一下这段代码在做什么吗?
我从https://github.com/python/cpython/blob/master/Python/bltinmodule.c得到代码
编辑:我只是好奇 len 函数是如何如此快速并偶然发现这段代码的。我只想知道为什么函数 PyObject_Size 用于检查对象的大小为零,然后 PyLong_FromSsize_t 返回实际大小。
【问题讨论】:
-
“我不知道 C 是如何工作的” - 那先学吧? SO 不是教程服务
-
“我不知道 C 是如何工作的” 至少要对 C 语法有一个基本的了解。没有人可以在一个 SO 答案中教你 C
-
我只是好奇 len 函数怎么这么快并且偶然发现了这段代码。我不是要求获得 C 教程。我只是想知道为什么函数 PyObject_Size 用于检查对象的大小为零,然后 PyLong_FromSsize_t 返回实际大小
-
你检查过这些函数是做什么的吗?你了解 Python 类型系统是如何在 CPython 中实现的吗? (提示:您不能将
Py_ssize_t返回给 Python) -
我不是程序员,我只是用python来涉足数据科学、机器学习的乐趣。我的目的不是成为 Python 或 CPython 专家。我不知道我必须成为专家才能提出关于 SO 的问题。我只是好奇而已。是的,我试图找到这些功能的实现,但没能找到。
标签: python c cpython python-internals