在 19-8-13 1:27, Andrew Barnert via Python-ideas 写道:
> On Aug 11, 2019, at 19:01, malin...@163.com wrote:
>>
>> The idea is mixing `PyLongObject` with `Python 2's PyIntObject` 
>> implementation.
>>
>> For example, on a 64-bit platform, if (an integer >=-9223372036854775808 and 
>> <=9223372036854775807), PyLongObject uses a native C type `signed long` to 
>> represent it.
>>
>> People mostly use +-* operations, maybe using native int is faster, even 
>> including the cost of overflow check.
>
> I’m assuming you don’t know C and/or CPython internals well enough to try it 
> out yourself, and that’s fine. But If you want to get someone else motivated 
> enough to try, you should at least provide some evidence that it’s 
> potentially worth it, beyond the fact that someone who doesn’t know the 
> internals thinks _maybe_ it’ll be faster.
>
> Have you benchmarked 2.7 vs. 3.7 adding various sizes of integers? (From a 
> quick test with Pythonista, 3.6 seems to actually be _faster_ if the total is 
> under 1<<30, although it does get slower beyond that, and especially between 
> 1<<60 and 1<<63.) Or looked up the history from when PyIntObject was removed 
> in 3.0? (There must have been lots of discussion on the -dev or py3k lists 
> about performance before deciding to do it, especially so soon after all the 
> work to make int/long interoperate seamlessly for later 2.x.) Or looked 
> through the implementation as far as you can understand it to spot things 
> that look slow? (longintrepr.h isn’t that complicated; longobject.c is pretty 
> hairy, but at least it’s well-commented.)
>
> By the way, I suspect you wouldn’t want two separate structures, but rather 
> just replace the int32 *digits with a union { int32 *digits; sintptr_t 
> smallnum; }, and size 1 or -1 means you use smallnum instead of digits. 
> Although I’m not sure how you’d do your “convert to present format for other 
> operations or detected overflow” thing (and presumably for mixed operations, 
> like adding a small int to a big one) that way, but I think you’re better off 
> just building the array of digits for the temporary rather than a whole int 
> object anyway.

Thanks for your guidance.
To be honest, it's a challenge for me.
It would be nice if an experienced person is willing to make this attempt.

> size 1 or -1 means you use smallnum instead of digits

Or use this value, this won't consume more memory than current implementation:
Py_SIZE(a)   32-bit platform  64-bit platform
LONG_MAX     4 bytes singed   8 bytes singed
LONG_MAX-1   2 bytes singed   4 bytes singed

_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/AAHMOFZL6QQAY7OQFOHD2AUHJ7TO6H7C/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to