[C++-sig] Trouble optimizing Boost.python integration (original) (raw)

Dan Sanduleac sanduleac.dan at gmail.com
Tue Aug 25 23:48:02 CEST 2009


Hi,

I'm trying to compare different python-C wrapping techniques to see which would be faster and also more suited to game development. I'm using Stackless Python 2.6.2 and boost 1.39.0. I implemented a simple Vec3 (3D vector) class in C++ and wrapped it with boost:python. All it does is multiplications and additions, so it implements just two operators. The thing is, it proves to be kind of slow compared to Cython/Pyrex code that does the same. I think it should run faster than Cython code. (Note: Cython is not an abbreviation for C/Python API) I compiled the python library from boost, in release mode, and then linked the vec3 module, provided below, to the compiled boost_python library. (I used -O2 when compiling the vec3 module)

The testing goes like this: each "tick", 10000 objects update their position, according to their velocity and timedelta since last "tick", and I'm measuring the average time a tick takes to complete. On my machine doing this with Cython takes ~0.026 sec/tick, while doing it with boost.python takes like 0.052 sec/tick (The overhead introduced by python's iterating through the list of objects each tick is about 0.01 sec) During one tick, for each object, python runs this: "self.position += self.velocity * time_delta", where position and velocity are instances of Vec3.

I was hoping for results better than with Cython, by using Boost. Am I doing something wrong?

Source code: vec3.cpp

#include <boost/python.hpp> using namespace boost::python;

class Vec3 {

float x, y, z;

public: Vec3(float x, float y, float z);

Vec3 &operator*=(float scalar);
Vec3 operator*(float scalar) const;
Vec3 &operator+=(const Vec3 &who);
// that `const Vec3` is REALLY needed, unless you want error monsoon 

to come down };

// === boost:python wrapper === // publish just += and * to python

BOOST_PYTHON_MODULE(vec3) { class_("Vec3", init<float, float, float>()) .def(self += self) .def(self * float()) ; }

// === implementation ===

Vec3::Vec3(float x, float y, float z) { this->x = x; this->y = y; this->z = z; }

Vec3 & Vec3::operator*=(float scalar) { this->x *= scalar; this->y *= scalar; thiz->z *= scalar;a }

Vec3 Vec3::operator*(float scalar) const { return Vec3(*this) *= scalar; }

Vec3 & Vec3::operator+=(const Vec3 &who) { this->x += who.x; this->y += who.y; this->z += who.z; return *this; }



More information about the Cplusplus-sig mailing list