is None or == None ?

Alf P. Steinbach alfps at start.no
Fri Nov 6 14:50:33 EST 2009


* Rami Chowdhury:
> On Fri, 06 Nov 2009 09:28:08 -0800, Alf P. Steinbach <alfps at start.no> 
> wrote:
> 
>> * Rami Chowdhury:
>>> On Fri, 06 Nov 2009 08:54:53 -0800, Alf P. Steinbach <alfps at start.no> 
>>> wrote:
>>>
>>>> But wow. That's pretty hare-brained: dynamic allocation for every 
>>>> stored value outside the cache range, needless extra indirection for 
>>>> every operation.
>>>>
>>>  Perhaps I'm not understanding this thread at all but how is dynamic 
>>> allocation hare-brained, and what's the 'needless extra indirection'?
>>
>> Dynamic allocation isn't hare-brained, but doing it for every stored 
>> integer value outside a very small range is, because dynamic 
>> allocation is (relatively speaking, in the context of integer 
>> operations) very costly even with a (relatively speaking, in the 
>> context of general dynamic allocation) very efficient small-objects 
>> allocator - here talking order(s) of magnitude.
> 
> Well, sure, it may seem that way. But how large a cache would you want 
> to preallocate? I can't see the average Python program needing to use 
> the integers from -10000 to 10000, for instance. In my (admittedly 
> limited) experience Python programs typically deal with rather more 
> complex objects than plain integers.

Uhm, you've misunderstood or failed to understand something basic, but what? The 
CPython implementation uses a cache to alleviate problems with performance. A 
tagged scheme (the usual elsewhere, e.g. Windows' Variant) doesn't need any 
cache and can't benefit from such a cache, since then an integer's value is 
directly available in any variable that logically holds an int. In short, a 
cache for integer values is maningless for the tagged scheme.


>>    int intValueOf( Object const& o )
>>    {
>>        if( o.type_id != int_type_id ) { throw TypeError(); }
>>        return static_cast<IntType*>( o.p )->value;    // Extra 
>> indirection
>>    }
> 
> If a large cache were created and maintained, would it not be equally 
> indirect to check for the presence of a value in the cache, and return 
> that value if it's present?

Again, that's meaningless. See above.


>> creating that value then involves a dynamic allocation.
> 
> Creating which value, sorry -- the type object?

Well it's an out-of-context quote, but t'was about creating the value object 
that a variable contains a pointer to with the current CPython implementation.

I'm sure that more information about tagged variant schemes are available on the 
net.

E.g. Wikipedia.


Cheers & hth.,

- Alf



More information about the Python-list mailing list