Amendment: Could I use a compiler directive to import sets if /needed/.

On Fri, Oct 24, 2008 at 12:17 PM, Aaron DeVore <[EMAIL PROTECTED]> wrote:
> Could I use a compiler directive to import sets if possible, then use
> another compiler directive to pick the type when using cdef? Example:
>
> IF PY_VERSION_HEX < 0x02040000:
> ----DEF USE_SETS_MODULE 1
> ----from sets import Set as set
>
> Later in the file...
>
> cdef class Foo:
> ----IF USE_SETS_MODULE:
> --------cdef object member_set
> ----ELSE:
> --------cdef set member_set
>
> I haven't figured out how to import compiler directive constants from
> Python.h, hence the lack of me just trying it out on my own.
>
> -Aaron
>
>
>>>> Yes, it would be nice to have that. The idea would be to do the
>>>> Set import
>>>> internally, to provide replacement implementations for the generated
>>>> PySet_*() calls that work at the Python level, and to enable that
>>>> machinery when the C compile-time Python version is Py2.3.
>>>> However, that's
>>>> work that someone has to do.
>>>>
>>>> OTOH, this is a pure legacy feature for code that must run with
>>>> Py2.3. I
>>>> guess people (including myself) can currently live with the little
>>>> performance impact regarding the set operations (which are fast
>>>> anyway),
>>>> given the gain that their code runs unchanged in Py2.3.
>>>
>>> I wish I had the time and expertise for this. :(
>>>
>>> Would this work if put at the top of every file (dashes indicate
>>> indentation)?
>>> if not hasattr(__builtin__, "set"):
>>> ----from sets import Set as set
>>>
>>> or this
>>> try:
>>> ----set
>>> except NameError:
>>> ----from sets import Set as set
>>>
>>> It seems like there could be an issue with static typing using the
>>> imported Python class sets.Set (e.g. `cdef set foo`). I don't know
>>> enough about Cython to make a good guess on that one.
>>
>> I think one would have to do
>>
>> try:
>>     from __builtin__ import set
>> except ImportError:
>>     from sets import Set as set
>>
>> One couldn't, however, do "cdef set foo" because the symbol set would
>> need to be resolved at compile time, whereas the code (as above)
>> defers its value to runtime. Consequently the code using the
>> PySet_Xxxx api directly wouldn't get generated (which of course only
>> works for 2.4+) Hackery could be done in the compiler to emulate the
>> builtin set API (via calling the Set module's class), but it should
>> be noted that the speed gains we're talking about here for the most
>> part are not that large (compared to, say, indexing into a list or
>> tuple with an int where there are huge savings).
>>
>> - Robert
>>
>> _______________________________________________
>> Cython-dev mailing list
>> [email protected]
>> http://codespeak.net/mailman/listinfo/cython-dev
>>
>
_______________________________________________
Cython-dev mailing list
[email protected]
http://codespeak.net/mailman/listinfo/cython-dev

Reply via email to