Форум сайта python.su
doza_andСпасибо большое! Дело сдвинулось с мертвой точки, по крайней мере что-то запустилось и работает/ Функция f, конечно же внутри сишного модуля и она будет не единственная.
Если вас интересует быстродействие то думаю надо начать с того где определена funct - ваша функция преобразования.
$ cat test.py
#!/usr/bin/python
import ctypes as C
import numpy as N
mymod=N.ctypeslib.load_library('libmy', '.')
a=N.ones([1,2,3,4],dtype='d')
b=N.ones(4,dtype='d')
mymod.mycopy(a.ctypes.data,4,b.ctypes.data)
$ cat libmy.c
#include <stdio.h>
void mycopy( const double* arg, int n, double* result ) {
int i;
for(i=0; i<n; ++i) result[i]=1.+arg[i];
}
doza_and1. vector просто удобнее для написания, например тот же размер в коде на С нужно передавать, а с вектором можно было бы убрать лишний параметр. Но потеря в скорости мне точно не нужна. Не могли бы объяснить какие преобразования вы имеете ввиду?
std::vector вам будет только мешать в преобразованиях туда сюда.
Офлайн
0 преобразования вот какие - у вас в питоне numpy.array а в c++ vector<vector<double> > в памяти они лежат по разному heap у них тоже разный (может быть) перед вызовами прийдется создавать соответствующие структуры а потом аккуратно перекладывать данные. В том что я предлагаю - ничего не надо перекладывать. В программу передается указатель на память которая принадлежит numpy.array и дальше сишная функция там ковыряется - питон об этом даже ничего не знает. Но память эта организована совсем не так как в vector и если вы насильно приведете тип - ничего кроме краха программы не получите.
1 В питоне нет аналога vector и вы не сможете создать вектор в питоне и использовать его в c++ (тому 2 причины в разных компиляторах c++ vector по разному устроен, поэтому создать его в питоне принципиально невозможно. Питон сам управляет выделенной памятью и вектор тоже управляет своей но уже с сишной стороны, они будут друг другу мешать)
2 Ответ частично содержится в первом пункте. - Питон и библиотеки с++ несовместимы! Их можно подружить (swig, boost python, python C-APY) , но только при условии использования одного компилятора. Внутри этих штучек куча магии… . Ну и на освоение я думаю уйдет у вас не меньше 2 недель. Более или менее прозрачно совместимы указатели и целые числа (не слишком большие). Поэтому лучше использовать numpy.zeros((m,4,3)) numpy.zeros((m,3,3)) разделив случаи 3 и 4 вершин или использовать всегда 4 вершины и добавить массив с количеством вершин.
3 А вы имя какое задали? В c++ функция с одним именем может принимать разные аргументы - реально создается много функций, имена которым компилятор сам от балды придумывает. посмотрите как называется ваша функция и вызывайте.
Обычно просто объясняют - эта функция будет не c++ функцией.
extern "C"
{
void __declspec(_stdcall) a();
}
Отредактировано (Май 31, 2011 20:05:56)
Офлайн