2013-05-04 3 views
1

Iterators 만 필요한 도구와 모듈 <algorithm>의 함수 포인터를 PyObjects에 사용할 수 있습니까?파이썬/C API를 사용하여 C++ - 반복자를 파이썬 목록에 사용 하시겠습니까?

내가 해결하려는 구체적인 문제는 (그것을 배울 구성되어) :

  • 내가 파이썬 목록에 저장된 ID의 거대한 목록을
  • 지금 나는 std::binary_search을 수행 할 이 목록에서 C++로 작성된 모듈을 사용하십시오.

파이썬 목록을 c- 배열로 액세스하여 (포인터를 사용하는/복사하지 않음) 벡터를 생성하고, binary_search 배열을 PyObject으로 내 보냅니다.

은 가능할 것인가?

답변

1

이진 검색은 복잡하지 않으므로 반복자 대신 인덱스 범위를 기반으로 코드를 간단히 코딩하지 않으시겠습니까? 나는리스트가 파이썬의 sequence protocol에 부합한다고 믿는다. 그래서 꽤 쉬워야한다.

실제로 학습을 위해 binary_search() 알고리즘을 사용하려는 경우 Python 시퀀스 맨 위에 STL 스타일 반복기를 만들 수 있습니다. 필요한 것은 시퀀스에 대한 포인터와 무작위 액세스 반복자를 만드는 인덱스입니다. 원하는 경우 목록의 Python 객체를 ID 유형 (일부 정수 유형 일 가능성이 있음)으로 투명하게 변환 할 수도 있습니다.

struct iterator 
{ 
    // typedefs required for fully compliant STL-style iterators 
    typedef PyObject* value_type; 

    iterator(PyObject* seqeunce, Py_ssize_t position): 
     m_sequence(sequence), m_position(position) 
    { 
     assert(PySequence_Check(m_sequence)); 
     assert(m_position >= 0); 
     assert(m_position <= PySequence_GetSize(m_sequence)); 
    } 
    value_type operator*() const 
    { 
     assert(m_position < PySequence_GetSize(m_sequence)); 
     return PySequence_GetItem(m_sequence, m_position); 
    } 
    iterator& operator++() 
    { 
     assert(m_position <= PySequence_GetSize(m_sequence)); 
     ++m_position; 
     return *this; 
    } 
    iterator& operator+=(size_t l) 
    { 
     m_position += l; 
     return *this; 
    } 
}; 

저는 이것을 컴파일하지 않았으며 몇 가지 부분을 잊어 버렸을 것입니다. 두 개의 이터레이터를 초기화하십시오. 하나는 오프셋이 0이고 다른 하나는 컨테이너 크기의 오프셋이 있고, 하나는 binary_search()입니다.

+2

+1 이것을 반복자로 마무리하는 방법을 보여줍니다. "이진 검색은 그다지 복잡하지 않습니다"라고 말하면서 도널드 크 누스 (Donald Knuth)는 "이진 검색의 기본 아이디어는 비교적 간단하지만 세부 사항은 놀랍도록 까다로울 수 있습니다 ..."라고 말합니다. 이진 검색이 개념적으로 얼마나 단순한 지 상관없이, 사용자 정의 구현을 롤링하는 대신 std :: binary_search를 사용하는 것이 좋습니다. =) – wjl

+0

사실, 바이너리 검색이 완벽하게 올바른 가장 어려운 알고리즘 중 하나 인 [evidence] (http://en.wikipedia.org/wiki/Binary_search#Implementation_issues)가 있습니다. – delnan

+1

정말 고마워, 그게 내가 필요한 힌트 야! https://github.com/zvynar/CModuleForPython에서 작동중인 구현을 찾을 수 있습니다. – zvyn

관련 문제