CPython PyTupleObject 인터페이스 분석
2182 단어 python 진급
typedef struct { PyObject_VAR_HEAD PyObject *ob_item[1]; } PyTupleObject;
일반 인터페이스:
PyTuple_New:Tuple 객체를 만듭니다. 매개변수는 크기를 만듭니다.
PyTuple_GetItem: Tuple의 요소를 가져옵니다. obitem 색인 index
PyTuple_SetItem: 인덱스 index와 전송할 PyObject 대상인 Tuple의 요소를 설정합니다
PyTuple_Pack: 여러 개의 대상을 하나의 PyTupleObject로 포장합니다. 파라미터는 크기 크기와 일련의 포장 요소입니다.
PyObject *
PyTuple_GetItem(PyObject *op, Py_ssize_t i)
{
if (!PyTuple_Check(op)) {
PyErr_BadInternalCall();
return NULL;
}
if (i < 0 || i >= Py_SIZE(op)) {
PyErr_SetString(PyExc_IndexError, "tuple index out of range");
return NULL;
}
return ((PyTupleObject *)op) -> ob_item[i];
}
int
PyTuple_SetItem(PyObject *op, Py_ssize_t i, PyObject *newitem)
{
PyObject *olditem;
PyObject **p;
if (!PyTuple_Check(op) || op->ob_refcnt != 1) {
Py_XDECREF(newitem); //
PyErr_BadInternalCall();
return -1;
}
if (i < 0 || i >= Py_SIZE(op)) {
Py_XDECREF(newitem); //
PyErr_SetString(PyExc_IndexError,
"tuple assignment index out of range");
return -1;
}
p = ((PyTupleObject *)op) -> ob_item + i;
olditem = *p;
*p = newitem; //
Py_XDECREF(olditem); //
return 0;
}
참고: PyTupleGetItem은 참조 수를 증가시키지 않으므로 객체를 소유하려면 PyXINCREF,Py_Tuple_SetItem에서 olditem에 대해 PyXDECREF.
PyTuple_MAXSAVESIZE = 20: 빈번한 메모리 조작을 방지하기 위해 캐시된 Tuple의 크기 한도값, 즉 Tize <20의 작은 Tuple 대상이
석방과 신청 시 캐시 처리를 추가합니다.
PyTuple_MAXFREELIST=2000: 캐시할 size의Tuple 최대 캐시 수량은 메모리를 적게 차지하기 위해 캐시가 너무 크면 안 됩니다.
캐시 객체 데이터 구조:
free_list:정적 캐시 대기열
num_캐시 카운터
free_list의 index는size의 크기에 대응하는 캐시 체인 테이블을 대표하며, 체인 테이블은op->ob 를 통과합니다item[0]사용 가능한 다음 PyTupleObject,numfree의 index는 크기 크기에 맞는 캐시 체인 길이를 나타냅니다.이게 왜 obitem 선언 섹션에 PyObject* ob 사용item[1] 요소실제 tuple 길이는 PyObjectVAR_HEAD의 obsize 위. -----------------------판권 성명: 본고는 CSDN 블로거인'흰둥이 조금'의 오리지널 글로 CC4.0 by-sa 판권 협의에 따라 원문의 출처 링크와 본 성명을 옮겨 싣습니다.텍스트 링크:https://blog.csdn.net/weixin_42092782/article/details/82527798