Передайте собственные Python объекты вместо пользовательского класса C ++ в аргументы функции SWIG - PullRequest
0 голосов
/ 02 марта 2020

Я использую библиотеку, написанную на C ++ и доступную для Python через SWIG. Одна из функций выглядит примерно так:

int addPoints(std::vector<Point> positions)

, где Point - это структура, определенная в C ++, которая имеет конструктор, который принимает массив из 3 чисел с плавающей запятой. Это очень медленно, потому что у меня около 1 миллиона очков, и в Python мне нужно назвать его как

addPoints([MyLib.Point(p) for p in my_points])

, и все вызовы MyLib.Point.__init__ занимают много времени.

Есть ли способ указать SWIG принимать Python список кортежей / списков с плавающей точкой в ​​качестве аргумента функции (ie просто my_points как есть), вместо того, чтобы требовать от меня вызова конструктора 1 миллион раз в Python?

Прошу прощения, это похоже на вопрос, на который раньше задавали и отвечали, но я не могу его найти. Я подозреваю, что это связано с типографскими картами, но документация SWIG о типографских картах отговаривает меня (как новичка) от попыток выяснить это самостоятельно:

"типографские карты" являются продвинутыми функция настройки, которая обеспечивает прямой доступ к низкоуровневому генератору кода SWIG. Мало того, они являются неотъемлемой частью системы типов SWIG C ++ (ее нетривиальные топики c).

...