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赋值的主要内容,如果未能解决你的问题,请参考以下文章

python 调用C代码获取数据,C代码要求1个结构参数, 其中有项目是指向缓冲区的指针,如何实现参数赋值?

大数乘法的C代码实现

STL的set中如何找第k大数?

python如何实现类似php的引用赋值

如何在Python中优化计算大数

matlab函数赋值如何实现?