C如何实现大数的Python赋值
Posted
技术标签:
【中文标题】C如何实现大数的Python赋值【英文标题】:How does C implements the Python assignment of large numbers 【发布时间】:2013-10-23 06:33:37 【问题描述】:Python 是用 C 编写的,实际上是一个 C 程序,这让我想知道如何处理十进制数字赋值。
C 程序如何实现非常大的十进制数(大于 int 或 long)的 Python 变量赋值?
例如:
a=10000... # a=(10^1000)
在 python 中运行时,我知道该值太大以至于它需要在内存中占用很多单词,所以 C 程序显然是这样做的,但是如何呢?
C 中的每个变量都有一个类型,但是 C 编译的代码不知道这个数字会有多大。
(python)C 程序如何处理该分配? (以及对这些变量的操作)
【问题讨论】:
是什么让您认为 Python 运行时会将值分配给 C 变量? 有趣的问题,但我不确定是不是这样,请参阅 Daenyth post 和 Duncan post 请在您的问题标题上更具体地说明大十进制数字 另一个帖子没有提到超过long和int的非常大的数字,这和我问的不一样。 @user2162550:Python long 不是 C long,它涉及非常大的数字。 OTOH,这个问题与它背后的 C 实现无关,所以我同意它不是重复的。 【参考方案1】:这是 CPython 2.7.5 中用于表示长整数的 C struct
:
/* Long integer representation.
The absolute value of a number is equal to
SUM(for i=0 through abs(ob_size)-1) ob_digit[i] * 2**(SHIFT*i)
Negative numbers are represented with ob_size < 0;
zero is represented by ob_size == 0.
In a normalized number, ob_digit[abs(ob_size)-1] (the most significant
digit) is never zero. Also, in all cases, for all valid i,
0 <= ob_digit[i] <= MASK.
The allocation function takes care of allocating extra memory
so that ob_digit[0] ... ob_digit[abs(ob_size)-1] are actually available.
CAUTION: Generic code manipulating subtypes of PyVarObject has to
aware that longs abuse ob_size's sign bit.
*/
struct _longobject
PyObject_VAR_HEAD
digit ob_digit[1];
;
如果您想进一步探索,download the source code 并查看以下文件:
./Include/longintrepr.h
./Include/longobject.h
./Objects/longobject.c
这将告诉您您可能想知道的每一个细节。 :)
【讨论】:
【参考方案2】:出于性能原因,Python 可能有自己的大量实现,但它可以使用任何第三方任意精度库,例如 GMP。
【讨论】:
以上是关于C如何实现大数的Python赋值的主要内容,如果未能解决你的问题,请参考以下文章