Уведомления

Группа в Telegram: @pythonsu

#1 Май 31, 2011 00:27:28

math.beginer
От:
Зарегистрирован: 2011-03-28
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

Списки в C API

doza_and
Если вас интересует быстродействие то думаю надо начать с того где определена funct - ваша функция преобразования.
Спасибо большое! Дело сдвинулось с мертвой точки, по крайней мере что-то запустилось и работает/ Функция f, конечно же внутри сишного модуля и она будет не единственная.
$ 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_and
std::vector вам будет только мешать в преобразованиях туда сюда.
1. vector просто удобнее для написания, например тот же размер в коде на С нужно передавать, а с вектором можно было бы убрать лишний параметр. Но потеря в скорости мне точно не нужна. Не могли бы объяснить какие преобразования вы имеете ввиду?

2. сишной функции как параметр нужно будет передавать список площадок, которые заданы вершинами и их 3-ри или 4-ре, каждая вершина задана 3-мя координатами. Т.е. в плюсах я бы использовал вектор площадок std::vector<Segm>, где структура Segm хранит вектор вершин (точек) , что-то типа Segm { std::vector<Point> ; } + может быть размер, а структура точка имеет три координаты Point{ double x,y,z;}. Строго numpy.array((3,3,3)) или numpy.array((3,4,3)) не подходят. Как здесь можно достигнуть совместимости Питон функции и Сишной (плюсовой) библиотеки?

3. so библиотека собранная компилятором c++ не работает в Питоне, а c gcc все ok. Это нормально?



Офлайн

#2 Май 31, 2011 19:55:16

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Списки в C API

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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version