2010-08-02 3 views
0

나는 Boost.Python을 사용하여 파이썬 프로그램 기능을 확장하고 있습니다. 파이썬 스크립트는 원시 모듈에 대한 호출을 많이하므로 파이썬에서 cpp 유형으로의 변환과 데이터 마샬링의 성능에 대해 정말로 우려하고 있습니다.파이썬 확장 - 성능

파이썬 C API를 통해 네이티브 방식으로 메소드를 노출하기로 결정했습니다. 누군가 이미 전에 그렇게 해본 적이 있습니까? 모든 성공은 ... 적어도 이론적으로는?

PyObject *를 클래스 인스턴스로 다시 변환하는 방법은 PyArg_parse가 O & 옵션을 제공하지만 내가 찾고있는 것은 단순히 메모리에있는 C++ 객체에 대한 포인터입니다 ... 어떻게 가져올 수 있습니까? 기능?

if (PyArg_ParseTuple(args, "O", &pyTestClass)) { // how to get TestClass from pyTestClass ?? }

감사

답변

1

나는 Boost.Python을 시도하지 않은,하지만 난 Cython뿐만 아니라 원시 C를 사용하여 파이썬을 확장했습니다. 나는 Cython을 추천한다. 주의를 기울이면 원시 C와 동일한 효율성으로 코드를 얻을 수 있지만 상용구 코드는 훨씬 적습니다.

효율성과 관련하여 상대적입니다. 그것은 당신이하고 싶은 것과 당신이하는 일에 달려 있습니다. 예를 들어, 내가 자주 한 일은 C에서 일부 이미지 처리 또는 행렬 연산의 내부 루프를 작성하고이 함수가 인수로 행렬에 대한 포인터와 함께 Python에 의해 호출되도록하는 것입니다. 행렬 자체가 복사되지 않으므로 오버 헤드가 최소화됩니다.

+0

일부 추상화를 가져올 수 있습니다. 나는 다음과 같은 간단한 함수를 가지고있다. def sum (a, b) : a + b를 반환한다. 이제는 C에서 호출 된 수십만 번씩 각 1 마이크로 초 정도의 가치가 있다고 상상해 봅시다. 분명히 이것은 단지 추상화 일뿐입니다. 즉, 그렇게하는 것이 타당하지 않다는 것을 알고 있습니다. 실생활에서 나는 더 나은 예를 가지고있다. 그래서 내가 여기서 필요한 것은 호출 간의 최소 지연 시간을 얻는 것입니다. 즉, 필요한 함수의 실제 함수를 호출하는 시간을 최적화해야한다는 것을 의미합니다. 그 상황에서 가장 좋은 방법은 무엇입니까? – Alex

+0

C에서 파이썬을 호출하고 싶습니까? 어쨌든 파이썬과 C 사이의 인터페이스 오버 헤드는 주로 객체에 박스/언 박스를 넣는 것에서 비롯됩니다 (예 : C에서는 int가 있고 파이썬에서는 정수가 더 큽니다). 그리고 참조 계산을 처리합니다. '빠름'이지만 호출 할 함수가 매우 간단하고 긴밀한 루프에서 호출해야하는 경우 오버 헤드가 너무 많을 수 있습니다. 관련 작업에 대한 아이디어를 얻으려면 Cython에는 Cython/Python 행에 대해 생성 된 C 코드를 표시하는 html 파일을 작성하는 옵션이 있습니다. 그러면 각 작업의 비용을 알 수 있습니다. – dimatura

관련 문제