2013-07-14 2 views
2

Python/C API에는 일반적으로 일반적으로 사용되는 상황과 특정 상황에 대해 더 효율적이거나 편리하게 비슷한 작업을 수행하는 많은 관련 기능이 있습니다.PyInt_FromLong과 Py_BuildValue의 차이점

예를 들어, PyDict_SetItemPyDict_SetItemString은 동일하지만 후자는 C 문자열을 키로 특수화합니다. PyList_SetItemPyList_SET_ITEM의 경우 두 번째는 오류 검사를하지 않으며 기존 항목 (explained here)을 지정하지 않습니다.

항상 Py_BuildValue 일 때 PyInt_FromLong과 같은 특별한 전환을 발생시키는 이유는 무엇입니까? 둘 다 파이썬 객체에 대한 새로운 참조를 반환하고 똑같은 일을하는 것처럼 보입니다. 이 같은 질문은 PyInt_FromSsize_t, PyTuple_Pack 등과 같은 함수에 적용됩니다 (모두 적절한과 적절한 형식 문자열을 사용).

언제 다른 하나를 사용해야합니까?

+1

[facade 패턴] (http://en.wikipedia.org/wiki/Facade_pattern)의 결과로'Py_BuildValue'를 볼 수 있습니다. 저수준 호출을 많이 포함하는 상위 수준 호출입니다. 필수는 아니지만 유용합니다. 분명히 저수준 API없이 하나의 함수'Py_BuildValue'를 사용하면 유지 보수 할 수백 줄 이상의 괴물로 끝날 것입니다. 그래서 다른 방법으로해야합니다 : 저수준 변환 API와 훨씬 더 짧고 유지 보수가 용이 한 하이 레벨 액세스를위한 파사드 기능. – Bakuriu

답변

4

성능 및 단순성 간의 절충입니다. 필자가 작성한 코드의 경우 Py_BuildValue를 사용하는 경향이 있습니다. 실행 시간을 신경 쓰지 않으면 (즉, 변경되지 않는 값 집합을 반환하거나 실행 시간이 너무 길면 여분의 오버 헤드가 중요하지 않습니다. 성능이 중요한 기능, 특히 루프의 가장 안쪽에있을 수있는 기능에 대해서는 가능한 가장 낮은 수준의 API 호출을 사용합니다.

가치가 있는지 없는지는 다른 질문입니다. 나는 최고의 성능을 얻으려고 노력하면서 보낸 시간을 결코 만회하지 않을 것이지만, 내 코드를 사용하는 다른 응용 프로그램이 상당히 빠르다는 것을 알고 있습니다.

+0

왜'Py_BuildValue'가 더 간단합니까? 오래 동안 키 입력이 몇 번 더 필요합니다. 'PyInt_FromLong'이 더 빠르면, 왜'Py_BuildValue'가 그것을 직접 호출하지 않을까요? – Jared

+2

일반적으로 함수의 반환 값이기도하지만 다른 C API 함수를 호출 할 때도 튜플을 만들 때만 Py_BuildValue 만 사용합니다. 퍼포먼스 크리티컬 한 함수에서 튜플을 반환 할 때, 실제로 빈 튜플을 생성하고 튜플 값을 설정합니다. 그것은'Py_BuildValue ("(NN)", ...)'을 호출하는 것보다 빠르지 만 더 많은 코드 라인을 필요로합니다. 단일 값을 만들 때 나는 항상 저수준 함수를 직접 사용합니다. 'Py_BuildValue'는'PyInt_FromLong'을 호출 합니다만, 먼저 문자열을 구문 분석하고 얼마나 많은 값이 필요한지 확인해야합니다. 약간 더 느립니다. – casevh

+0

감사합니다. 귀하의 의견과 바쿠 리우 (Bakuriu 's)는 내가 찾고있는 진정한 대답 이었지만 여전히 정확한 대답으로 표시 할 것입니다. – Jared