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

좋은 웹페이지 즐겨찾기