Hey Andreas,
> Is there a way to cll my self-defined
Python-functions from the embeded C++
> code??
You can. Since code is all C++ code,
and your wanting to call a Python function, you have to do two
things:
1. Pass the
function you want to call as an argument to inline.
2. Call the
function using the Python API.
Take note that the call back into Python
exacts a large performance toll, so you probably won't see much speed
up.
>
> And if so, how???
>
Here is an example from
weave/examples/functional.py that is similar to Python's builtin map().
There is a 2nd "prettier" version in functional.py, but it is half the
speed of the standard map() function.
def
c_list_map2(func,seq):
""" Uses
Python API more than CXX to implement a simple map-like
function.
It does not provide any error
checking.
"""
code =
"""
Py::Tuple args(1);
Py::List
result(seq.length());
PyObject* item =
NULL;
PyObject* this_result =
NULL;
for(int i = 0; i <
seq.length();i++)
{
item =
PyList_GET_ITEM(seq.ptr(),i);
PyTuple_SetItem(args.ptr(),0,item);
this_result =
PyEval_CallObject(func,args.ptr());
PyList_SetItem(result.ptr(),i,this_result);
}
return_val =
Py::new_reference_to(result);
"""
return
inline_tools.inline(code,['func','seq'])
seq = ['aadasdf'] * 5
result =
c_list_map2(len,seq)
If you can re-write
the function you need to call as a C function, then you can call
it directly in C to get the speed back. There are many cases where
this isn't feasible, but some where it is. Use the support_code
key variable for this. I think there are some examples of this in
weave/examples/fibonacci.py
Hope that helps,
eric