2016-08-10 19 views
0

제목이 혼란 스러울 수 있습니다. 여기서 나는 더 명확하게 나의 질문을 진술 할 것이다.너무 많이 복사하지 않고도 Python 컨텍스트에서 C++로 데이터를 보낼 수있는 좋은 방법이 있습니까

저는 Python (Flask와 cherryPy와 같은 많은 기존 프레임 워크)과 C++ 계산 엔진을 기반으로 웹 사이트를 만들어 처리 속도를 높이고 싶습니다. 그래서 파이썬이 C++ 함수를 호출하기위한 인터페이스를 생성해야합니다. 다행히도 boost.python이 그 일을 할 수있다. 그러나 파이썬에서 데이터를 보낼 때마다 C++에 매트릭스를 말하면서 파이썬리스트를 사용해야합니다. 즉, 매트릭스 데이터를 목록으로 변환하고 C++ 컨텍스트에서 목록을 내부 매트릭스 객체로 변환해야합니다. 결과적으로 지능적 또는 효율적인 접근 방식이 될 수없는 많은 데이터 복사가 발생합니다. 그래서 내 질문에 복잡성을 고려하여 boost.python을 통해 C++ 행렬 클래스를 파이썬 클래스에 매핑하지 않으면 적은 수의 복사본으로도 유사한 작업을 수행 할 수있는 더 좋은 방법이 있을까요?

+0

을 당신은 매트릭스와 직접 경우 싶은 일을 NumPy와 사용하여 시도 할 수 있습니다. 그것은 빠르다. – user357269

+0

numpy는 좋지만 큰 데이터 문제에 대해서는 C++이 더 빠르다고 생각합니다. 그래서 C++로 구현 된 함수를 계산 엔진으로 사용하고자합니다. – doody1986

답변

2

마다 난 행렬, C++로 제가 데이터리스트로와 C의 행렬을 변환하는 것을 의미 파이썬리스트를 사용해야 말한다 파이썬에서 데이터를 전송 ++ 컨텍스트 변환 내부 행렬 개체에 나열하십시오.

아니요, 파이썬 목록을 사용할 필요가 없습니다. 복사하지 않고 C++에 전달할 수 있고 행렬 래퍼 클래스를 사용하여 행렬로 보는 C 연속 세그먼트로 데이터를 할당하는 numpy 배열을 사용할 수 있습니다. 파이썬에서

는 NumPy와를 사용하여 2 차원 배열을 할당 : 파이썬에 노출 아래와 같은 기능을 사용하여 C에

>>> y=np.empty((2,5), dtype=np.int16) 
>>> y 
array([[ 12, 27750, 26465, 2675,  0], 
     [ 0,  0,  0, 2601,  0]], dtype=int16) 
>>> y.flags['C_CONTIGUOUS'] 
True 
>>> foo(y,2,5) 

패스 행렬 데이터 ++ :

void foo(python::object obj, size_t size1, size_t size2) 
{ 
    PyObject* pobj = obj.ptr(); 
    Py_buffer pybuf; 
    PyObject_GetBuffer(pobj, &pybuf, PyBUF_SIMPLE); 
    void *buf = pybuf.buf; 
    int16_t *p = (int16_t*)buf; 
    Py_XDECREF(pobj); 

    MyMatrixWrapper matrix(p, size1, size2); 
    // .... 
}