On Apr 5, 2009, at 12:26 PM, Hoyt Koepke wrote:

> Hello,
>
> I'm using an extension class where I need to create a number of
> instances quickly, and I'm looking at the section "Can Cython create
> objects or apply operators to locally created objects as pure C code?"
> on http://wiki.cython.org/FAQ.  Is this information still correct?
>
> In particular, I'm wondering about it in reference to supporting
> cyclical garbage collection and creating object via PyObject_GC_New
> etc.  IIRC, cython automatically supports cyclical garbage collection
> on classes that have python members, and my extension class falls into
> this category.  Should I
>
> a) Use Py_NEW, as specified in the FAQ?

Yes, if one has an absolute need for speed. Cyclic garbage collection  
is supported via a flag on the type.

> b) Replace Py_NEW with Py_Object_GC_New, and do a?

Py_Object_GC_New will allocate the space, but will not call the  
__cinit__ functions, and in particular will not initialize the base  
fields, so don't use this unless you really know what you're doing.

> c) Ignore this and just go with standard creation and deletion,
> ignoring the fact that I'll be calling the constructors through
> python.

This is what I would do, at least until I determined object creation  
was a large bottleneck. PY_NEW as stated on the wiki calls the  
__cinit__ functions, but avoids calling the __init__ functions, so  
depending on your usecase it can be a savings. Also, it would be  
desirable and feasible to potentially call __init__ via a C call  
rather than a Python call (maybe, if the signature is simple enough,  
using the cpdef trick to avoid the pythonic argument packing/ 
unpacking overhead.)

- Robert

_______________________________________________
Cython-dev mailing list
[email protected]
http://codespeak.net/mailman/listinfo/cython-dev

Reply via email to