如何使用 PyObjects 数组扩展 Python 列表
How to extend a Python list with an array of PyObjects
我正在尝试处理一个 API,returns 一个 PyObject
数组,我想 extend
一个现有的 python list
及其内容。
到目前为止,我只是附加数组的每一项:
static PyObject *
myfunc(PyObject *module, PyObject *alist, PyObject **items, Py_ssize_t arrsize)
{
Py_ssize_t i;
for (i = 0 ; i < arrsize; i++) {
if (PyList_Append(alist, items[i]) == -1) {
return NULL;
}
}
return alist;
}
但是列表或多或少只是 array of PyObject
s 本身的包装器。
那么有没有更好(或更快)的方法来扩展该列表?我还没有在 Python-C-API 中找到一个函数,考虑到 PyList_Object
的过度分配,创建一个新数组似乎很麻烦,然后 memcpy
原始数组然后将其分配给 ((PyList_Object *)alist)->ob_item
.
您的意图是实施或使用 list.extend()
,但是
l.extend(items)
正好等同于
l[len(l):] = items
这可以在 python c api PyList_SetSlice
本身内完成,但您需要创建新列表的开销。但这比每次追加都调整列表的大小要好。
static PyObject *
myfunc(PyObject *module, PyObject *alist, PyObject **items, Py_ssize_t arrsize)
{
Py_ssize_t i, len = PyList_GET_SIZE(alist);
PyObject *l = PyList_New(arrsize);
int r = PyList_SetSlice(alist, len, len + arrsize, l);
Py_CLEAR(l);
if (r == -1) {
return NULL;
}
for (i = 0 ; i < arrsize; i++) {
Py_INCREF(items[i]);
PyList_SET_ITEM(alist, len + i, items[i]);
}
return Py_INCREF(alist), alist;
}
此外,您丢失了对 return 的引用。
我正在尝试处理一个 API,returns 一个 PyObject
数组,我想 extend
一个现有的 python list
及其内容。
到目前为止,我只是附加数组的每一项:
static PyObject *
myfunc(PyObject *module, PyObject *alist, PyObject **items, Py_ssize_t arrsize)
{
Py_ssize_t i;
for (i = 0 ; i < arrsize; i++) {
if (PyList_Append(alist, items[i]) == -1) {
return NULL;
}
}
return alist;
}
但是列表或多或少只是 array of PyObject
s 本身的包装器。
那么有没有更好(或更快)的方法来扩展该列表?我还没有在 Python-C-API 中找到一个函数,考虑到 PyList_Object
的过度分配,创建一个新数组似乎很麻烦,然后 memcpy
原始数组然后将其分配给 ((PyList_Object *)alist)->ob_item
.
您的意图是实施或使用 list.extend()
,但是
l.extend(items)
正好等同于
l[len(l):] = items
这可以在 python c api PyList_SetSlice
本身内完成,但您需要创建新列表的开销。但这比每次追加都调整列表的大小要好。
static PyObject *
myfunc(PyObject *module, PyObject *alist, PyObject **items, Py_ssize_t arrsize)
{
Py_ssize_t i, len = PyList_GET_SIZE(alist);
PyObject *l = PyList_New(arrsize);
int r = PyList_SetSlice(alist, len, len + arrsize, l);
Py_CLEAR(l);
if (r == -1) {
return NULL;
}
for (i = 0 ; i < arrsize; i++) {
Py_INCREF(items[i]);
PyList_SET_ITEM(alist, len + i, items[i]);
}
return Py_INCREF(alist), alist;
}
此外,您丢失了对 return 的引用。