Pyrex – from confusion to enlightenment
My last post explained my frustration trying to get pyrex to do *anything*. Since then, several people posted solutions and e-mailed me with more ideas (thanks allefant and Filip Wasilewski). My review was focused on the usability of pyrex as a python->C translator, since that’s what I was working on with both shed-skin and pypy/rpython. It didn’t hold up so well. This is because … pyrex ISN’T a python->C translator.
pyrex is its own special language that contains both python and C stuff. pyrex does not do type inference. What pyrex provides is a way to mix both python and python-like C code together in the same files. The trick to understanding pyrex is to know where the line between python and C is in pyrex.
Here are some of the gotchas I experienced. I wasn’t able to detail them in my previous post because I didn’t really “get it”. Now I think I do, so I’ll explain some stuff so you can try out pyrex without getting confused the way I did:
Gotcha #1: float() is a python function
cdef int a cdef float b a = 3 b = float(a)
Solution: use pyrex’s casting to avoid massive object-conversion speed penalties
b = <float>a
Gotcha #2: pyrex doesn’t do type inference
def set_video(int w, int h): s = Surface() s.surf = SDL_SetVideoMode(w,h,32,0) return s
pyrex: Cannot convert 'SDL_Surface *' to Python object
Solution: to access your C-members you must declare the variable’s type first
def set_video(int w, int h): cdef Surface s s = Surface() s.surf = SDL_SetVideoMode(w,h,32,0) return s
Gotcha #3: def makes python functions – which are slow
def set_pixel(self,int x, int y, int color)
Solution: To be able to access a fast version of a method in C and be able to access the same method in python you must define two versions of it
cdef _set_pixel(self,int x, int y, int color): pass # do this really fast
def set_pixel(self,int x, int y, int color): return self._set_pixel(x,y,color)
All that said, I think pyrex is really neat for writing extensions! One of the best features it has is properties (which are like descriptors, only easier). Just be careful if you use it to not mistake it for python. Lastly, by using those tips I was able to get my julia example to be full speed.
December 6th, 2007 at 4:56 am
You might find Cython (http://www.cython.org/) interesting. It is based on Pyrex (http://wiki.cython.org/DifferencesFromPyrex). Cheers.
December 7th, 2007 at 4:14 am
Can you post a link to your improved Pyrex version of the Julia example?
December 7th, 2007 at 12:59 pm
I’ve just updated this with the changes:
http://www.imitationpickles.org/tmp/pyrex.zip
December 15th, 2007 at 8:06 pm
very interesting, but I don’t agree with you
Idetrorce