Как использовать unordered_map в cython?
Я хочу пошаговое руководство, как использовать unordered_map в Cython.
Я включил файл unordered_map.pxd в Cython / Includes / libcpp из https://gist.github.com/ikuyamada/3265267 и использую 3 других файла:
main.py:
import pyximport;
pyximport.install()
from foo import F
F()
foo.pyx:
from libcpp.unordered_map cimport unordered_map
def F():
cdef unordered_map[int, int] my_map
my_map[1]=11
my_map[2]=12
print my_map[1],my_map[2]
foo.pyxbld: (для компиляции foo.pyx в C++)
def make_ext(modname, pyxfilename):
from distutils.extension import Extension
return Extension(name=modname,
sources=[pyxfilename],
language='C++')
Когда я запускаю test.py, я получаю сообщение об ошибке:
foo.cpp
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\INCLUDE\xlocale(342) : warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc
C:\Users\kitov\.pyxbld\temp.win-amd64-2.7\Release\pyrex\foo.cpp(316) : fatal error C1083: Cannot open include file: 'tr1/unordered_map': No such file or directory
Я использую Win7, Python 2.7 64bit, VS2008 Professional.
2 ответа
Я решил проблему:
1) Мне нужно было установить Visual C++ 2008 Feature Pack с http://www.microsoft.com/en-us/download/details.aspx?id=6922
2) Мне нужно было использовать следующий unordered_map.pxd:
from libcpp.utility cimport pair
cdef extern from "<unordered_map>" namespace "std::tr1":
cdef cppclass unordered_map[T, U]:
cppclass iterator:
pair[T, U]& operator*() nogil
iterator operator++() nogil
iterator operator--() nogil
bint operator==(iterator) nogil
bint operator!=(iterator) nogil
unordered_map()
unordered_map(unordered_map&)
U& operator[](T&) nogil
# unordered_map& operator=(unordered_map&)
U& at(T&) nogil
iterator begin() nogil
void clear() nogil
size_t count(T&) nogil
bint empty() nogil
iterator end() nogil
pair[iterator, iterator] equal_range(T&) nogil
void erase(iterator) nogil
void erase(iterator, iterator) nogil
size_t erase(T&) nogil
iterator find(T&) nogil
pair[iterator, bint] insert(pair[T, U]) nogil
iterator insert(iterator, pair[T, U]) nogil
void insert(input_iterator, input_iterator)
size_t max_size() nogil
void rehash(size_t)
size_t size() nogil
void swap(unordered_map&) nogil
Одна строка была изменена по сравнению с https://gist.github.com/ikuyamada/3265267:
cdef extern from "<tr1/unordered_map>" namespace "std::tr1":
->
cdef extern from "<unordered_map>" namespace "std::tr1":
Если вы уже скомпилировали foo
Я не думаю, что вам нужно бежать pyximport.install()
, Это могло бы испортить это с pyximport
перекомпилирует исходный код, но вы не предоставили никаких аргументов компилятора для pyximport
, так что он скомпилирован с настройками по умолчанию (т.е. не зная, foo
исходный файл cpp)
main.py:
from foo import F
F()
foo.pyx: <- не забудьте x
#distutils: language = c++
from libcpp.unordered_map cimport unordered_map
def F():
cdef unordered_map[int, int] my_map
my_map[1]=11
my_map[2]=12
print my_map[1],my_map[2]