Поддерживаются ли контейнеры C++11 Cython?

Cython дает нам простой способ импортировать структуры данных стандартной библиотеки C++, например:

  from libcpp.vector cimport vector
    from libcpp.utility cimport pair

Но как насчет новых контейнеров, появившихся в C++11: std::unordered_map, std::unordered_set и т. д. Поддерживаются ли они таким же образом? Я не смог найти соответствующий оператор импорта.


person clstaudt    schedule 08.10.2013    source источник


Ответы (2)


Cython не поддерживает их по умолчанию, но вы, вероятно, могли бы создать свой собственный интерфейс, следуя структуре https://github.com/cython/cython/blob/master/Cython/Includes/libcpp/map.pxd.

Cython теперь поддерживает unordered_map и unordered_set начиная с 0.20.2< /а>.

from libcpp.unordered_map cimport unordered_map
from libcpp.unordered_set cimport unordered_set
person kennytm    schedule 08.10.2013
comment
Этот ответ, вероятно, был правильным в то время, но теперь устарел. - person Ami Tavory; 21.05.2015

Текущие версии cython позволяют это сделать.

Убедитесь, что ваш setup.py содержит что-то вроде:

ext_module = Extension(
    "foo",
    ["foo.pyx"],
    language="c++",
    extra_compile_args=["-std=c++11"],
    extra_link_args=["-std=c++11"]
)

Затем вы можете использовать

from libcpp.unordered_map cimport unordered_map

как и для любого другого класса STL.

person Ami Tavory    schedule 21.05.2015
comment
Похоже, это не работает с (нынешним) Cython: /usr/local/lib/python2.7/dist-packages/Cython/Compiler/Main.py:554: UserWarning: got unknown compilation options, please remove: extra_link_args, extra_compile_args (а затем происходит сбой с ошибкой, связанной с C++ 11). Мой setup.py выглядит так: ext_modules = cythonize('x.pyx', language='c++', <options>). - person David Nemeskey; 23.10.2015
comment
@David Вы должны использовать синтаксис Extension() вместо указания параметров непосредственно в cythonize(). - person Thomas Walther; 04.12.2015
comment
Мне пришлось добавить -stdlib=libc++ в extra_compile_args, чтобы это работало на Mac OSX 10.11.6. - person Noah_S; 22.06.2018
comment
В Ubuntu 20.04, Cython версии 0.29.23 он работает OOTB, дополнительная настройка не требуется. - person Rune Kaagaard; 19.04.2021