Форум сайта python.su
Для ускорения Питон приложений часть расчетов вынесена в Си-функции, работающие так
void myfunct(const double *x, const double *y, const double *z ... double *out);
Офлайн
А как вы используете myfunct?
Если используете модуль ctypes, то наверное подойдет зарегистрировать callback средствами ctypes и изменить сигнатуру вызова.
например так:
void myfunct(const double *x, const double *y, const double *z ... double *out, void (*fp)(void));
Отредактировано (Окт. 7, 2011 11:19:16)
Офлайн
Спасибо, пытаюсь понять по ссылке что делать :-)
doza_andВот эта схема позволила избавиться от Питон циклов, там где очень трудно построить матричное выражение:
А как вы используете myfunct?
void test_funct(const int n, const double* x, double* out){
int i;
double cx ;
for(i=0; i<n; ++i){
cx = *(x++);
*(out++) = 2.*cx;
}
}
def test_funct(t):
res = ndarray(t.shape,dtype='d')
n = t.shape[0]
test.test_funct(n,t.reshape(-1,1).ctypes.data,res.reshape(-1,1).ctypes.data)
return res
t=numpy.linspace(0,1,10);
R=test_funct(t)
void test_funct(const int n, const double* x, double* out, double(*fp)(double)){
int i;
double cx ;
for(i=0; i<n; ++i){
cx = *(x++);
*(out++) = fp(cx);
}
}
CMPFUNC = CFUNCTYPE(c_double)
def test_funct(t):
res = ndarray(t.shape,dtype='d')
n = t.shape[0]
test.test_funct(n,t.reshape(-1,1).ctypes.data,res.reshape(-1,1).ctypes.data,CMPFUNC(scipy.special.j0))
return res
./test.py
Traceback (most recent call last):
File "_ctypes/callbacks.c", line 295, in 'calling callback function'
ValueError: invalid number of arguments
Traceback (most recent call last):
File "_ctypes/callbacks.c", line 295, in 'calling callback function'
ValueError: invalid number of arguments
Traceback (most recent call last):
File "_ctypes/callbacks.c", line 295, in 'calling callback function'
ValueError: invalid number of arguments
Traceback (most recent call last):
File "_ctypes/callbacks.c", line 295, in 'calling callback function'
ValueError: invalid number of arguments
Traceback (most recent call last):
File "_ctypes/callbacks.c", line 295, in 'calling callback function'
...
Отредактировано (Окт. 7, 2011 21:13:45)
Офлайн
Вы неправильно описали функцию и делаете не так как в документации
CMPFUNC = CFUNCTYPE(c_double,c_double)
берет и возвращает double
def J0(v):
return scipy.special.j0(v)
test.test_funct(n,t.reshape(-1,1).ctypes.data,res.reshape(-1,1).ctypes.data,CMPFUNC(J0))
>>> scipy.special.j0([1,4,3])
array([ 0.76519769, -0.39714981, -0.26005195])
>>> y=scipy.special.j0(t)
Отредактировано (Окт. 7, 2011 21:39:24)
Офлайн
doza_andтак пример сильно упрощенный, чтобы сосредоточится на сути проблемы
Вы неправильно описали функцию и делаете не так как в документацииСкорее всего будет работать и как у вас, но всетаки…CMPFUNC = CFUNCTYPE(c_double,c_double)
берет и возвращает double
def J0(v):
return scipy.special.j0(v)
test.test_funct(n,t.reshape(-1,1).ctypes.data,res.reshape(-1,1).ctypes.data,CMPFUNC(J0))
Спасибо! CMPFUNC = CFUNCTYPE(c_double,c_double) решило проблему
Кстати в вашем случае гораздо быстрее будет просто применить j0 к массиву out (гораздо быстрее чем дергать callback)МОжет я ошибаюсь но помоему ваш пример будет выглядеть так:>>> scipy.special.j0([1,4,3])
array([ 0.76519769, -0.39714981, -0.26005195])>>> y=scipy.special.j0(t)
Офлайн