[c++-sig] How does C++ cooperate with python array?
I'm sure it is a newbie question. ^_^ In my python program, it will generate a very big array stored in array.array. The data processing is time consuming. So I want to move it into C++, and return the result array back to python. Could you give me a related example by using Boost.Python library? It may like this: ============ # python code ar = array(...) ret = func(ar) # call a Boost.Python exported funtion which accepts a array.array parameter. ... # C++ code array func(array& ar) // just simple array.array, not numpy.array { ... //return array } BOOST_PYTHON_MODULE() {...} ============ Another concern is about the memory management. If I create a new array in C++ part, who will take charge of memory release? And, is there any implicit data-copying on the way that the array is passed between C++ and python? Due to the size of the array is very large, any unnecessary copy will lead to poor performance. Is there anything I should pay attention to when using Boost.Python? Thank you. -- ShenLei
On 6/4/07, 甜瓜 <littlesweetmelon@gmail.com> wrote:
I'm sure it is a newbie question. ^_^ In my python program, it will generate a very big array stored in array.array.
It seems that this module doesn't provide C API. Is it possible to get access from C++ to the underlying array?
The data processing is time consuming. So I want to move it into C++, and return the result array back to python.
A new array or you want to reuse the array instance you pass as argument.
Could you give me a related example by using Boost.Python library? It may like this: ============ # python code ar = array(...) ret = func(ar) # call a Boost.Python exported funtion which accepts a array.array parameter.
You will not find example that does exactly what you want. Boost.Python tutorials is a good place to start. You can always right something like this: boost::python::object func( boost::python::object ){ ... } def( "func", &::func );
...
# C++ code array func(array& ar) // just simple array.array, not numpy.array
What do you mean simple array "int*" or instance of array.array type?
{ ... //return array }
BOOST_PYTHON_MODULE() {...}
============ Another concern is about the memory management. If I create a new array in C++ part, who will take charge of memory release?
It depends. If you will write the right code than Boost.Python, otherwise you( your users )
And, is there any implicit data-copying on the way that the array is passed between C++ and python?
You don't have to copy the whole array, but you should understand that you do construct new Python object every time you access an item within the array
Due to the size of the array is very large, any unnecessary copy will lead to poor performance.
Is there anything I should pay attention to when using Boost.Python?
Well it is possible to create clean solution, that will not force you copy arrays. May be you should consider to expose std::vector< your type > ( http://boost.org/libs/python/doc/v2/indexing.html#vector_indexing_suite ) and implement all interface using it. Thus you will have good performance and memory management. -- Roman Yakovenko C++ Python language binding http://www.language-binding.net/
Thank you very much. I went through the intro and manual document of boost.python. Now I can emerge C++ and python smoothly. -- ShenLei
participants (2)
-
Roman Yakovenko -
甜瓜