PythonVectorcall是Python 3.8中引入的一种新的C API
▥Python
𝄐 0
vectorize python,python vector2,python visa库,pythoneval(),python中vector类,python vector变量
PythonVectorcall是Python 3.8中引入的一种新的C API调用约定,它旨在提高Python函数的调用性能和可扩展性。相较于传统的PyArg_ParseTuple()函数,PythonVectorcall使用更为简洁的方式来处理参数。
PythonVectorcall支持API主要包括以下三个部分:
1. PyMethodDef.method_vectorcall_func方法指针:这是一个可选的字段,如果函数被定义为这种类型,则可以使用vectorcall API进行调用。
2. PyObject_CallMethodObjArgs()函数:这是标准的PyObject_CallFunction()的向量化版本,用于调用特定对象上的方法。
3. PyObject_Vectorcall()函数:这是最通用的向量化调用方法,它可以用于任何Python callable(可调用)对象,包括函数、方法和类。
下面是一个使用PythonVectorcall的例子:
c
static PyObject* spam_foo(PyObject* self, PyObject* args, PyObject* kwargs)
{
static char* kwlist[] = {"a", "b", "c", NULL};
int a, b, c;
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "iii", kwlist, &a, &b, &c)) {
return NULL;
}
return Py_BuildValue("i", a + b + c);
}
static PyMethodDef SpamMethods[] = {
{"foo", (PyCFunction)spam_foo, METH_FASTCALL|METH_KEYWORDS,
"Add three integers."},
{NULL, NULL, 0, NULL}
};
static struct PyModuleDef spammodule = {
PyModuleDef_HEAD_INIT,
"spam",
NULL,
-1,
SpamMethods
};
PyMODINIT_FUNC PyInit_spam(void)
{
return PyModule_Create(&spammodule);
}
在上面的例子中,我们定义了一个名为"foo"的函数,并使用PythonVectorcall API来处理参数。该函数将三个整数相加并返回结果。注意,在PyMethodDef结构体中,我们将spam_foo函数指定为method_vectorcall_func字段,以便可以使用向量化API进行调用。
现在让我们来看看如何在Python中调用这个函数:
python
import spam
# 使用传统的方式调用函数
a = 1
b = 2
c = 3
result = spam.foo(a, b, c) # result = 6
# 使用向量化API调用函数
args = (a, b, c)
result = spam.foo(*args) # result = 6
在上面的Python代码中,我们展示了两种不同的方法来调用spam模块中的foo函数。第一种方法是传统的方式,即直接传递参数。第二种方法使用了向量化API,它首先将参数打包到一个元组中,然后使用*args语法将元组作为参数传递给函数。
PythonVectorcall是Python 3.8中引入的一种新的C API调用约定,它旨在提高Python函数的调用性能和可扩展性。相较于传统的PyArg_ParseTuple()函数,PythonVectorcall使用更为简洁的方式来处理参数。
PythonVectorcall支持API主要包括以下三个部分:
1. PyMethodDef.method_vectorcall_func方法指针:这是一个可选的字段,如果函数被定义为这种类型,则可以使用vectorcall API进行调用。
2. PyObject_CallMethodObjArgs()函数:这是标准的PyObject_CallFunction()的向量化版本,用于调用特定对象上的方法。
3. PyObject_Vectorcall()函数:这是最通用的向量化调用方法,它可以用于任何Python callable(可调用)对象,包括函数、方法和类。
下面是一个使用PythonVectorcall的例子:
c
static PyObject* spam_foo(PyObject* self, PyObject* args, PyObject* kwargs)
{
static char* kwlist[] = {"a", "b", "c", NULL};
int a, b, c;
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "iii", kwlist, &a, &b, &c)) {
return NULL;
}
return Py_BuildValue("i", a + b + c);
}
static PyMethodDef SpamMethods[] = {
{"foo", (PyCFunction)spam_foo, METH_FASTCALL|METH_KEYWORDS,
"Add three integers."},
{NULL, NULL, 0, NULL}
};
static struct PyModuleDef spammodule = {
PyModuleDef_HEAD_INIT,
"spam",
NULL,
-1,
SpamMethods
};
PyMODINIT_FUNC PyInit_spam(void)
{
return PyModule_Create(&spammodule);
}
在上面的例子中,我们定义了一个名为"foo"的函数,并使用PythonVectorcall API来处理参数。该函数将三个整数相加并返回结果。注意,在PyMethodDef结构体中,我们将spam_foo函数指定为method_vectorcall_func字段,以便可以使用向量化API进行调用。
现在让我们来看看如何在Python中调用这个函数:
python
import spam
# 使用传统的方式调用函数
a = 1
b = 2
c = 3
result = spam.foo(a, b, c) # result = 6
# 使用向量化API调用函数
args = (a, b, c)
result = spam.foo(*args) # result = 6
在上面的Python代码中,我们展示了两种不同的方法来调用spam模块中的foo函数。第一种方法是传统的方式,即直接传递参数。第二种方法使用了向量化API,它首先将参数打包到一个元组中,然后使用*args语法将元组作为参数传递给函数。
本文地址:
/show-276851.html
版权声明:除非特别标注原创,其它均来自互联网,转载时请以链接形式注明文章出处。