Python如何实现模运算?

时间:2013-08-12 23:29:32

标签: python operators modulo modulus

我对Python中%运算符的时间和空间复杂性感到好奇。此外,Python是否对% 2使用按位运算?

修改 我问的是Python 2.7的实现,以防它与Python 3略有不同

2 个答案:

答案 0 :(得分:10)

Python使用Knuth的“计算机编程艺术”中的经典算法D.运行时间(通常)与两个数字的长度乘积成比例。空间与两个数字的长度之和成正比。

实际除法发生在Objects/longobject.c,请参阅 x_divrem()。有关Python long内部表示的背景知识,请参阅Include/longintrepr.h

% 2不使用按位运算。检查数字是偶数/奇数的标准惯用语是& 1

Python 2和3使用相同的算法。

答案 1 :(得分:2)

2.7版的python文档(http://docs.python.org/2.7/library/functions.html?highlight=divmod#divmod)提供了一些基本信息。

我还看了一下源代码;我不足以真正解释发生了什么,但Objects \ abstract.c将“divmod()”定义为二进制函数。

在第1246行,为余数定义了一个函数:

PyObject *
PyNumber_Remainder(PyObject *v, PyObject *w)
{
    return binary_op(v, w, NB_SLOT(nb_remainder), "%");
}

binary_op函数在第994行定义,主要包装在第922行定义的函数“binary_op1”。从那里,大多数代码运行到第895行定义的名为“NB_BINOP”的函数,如下面的代码所示:

#define NB_BINOP(nb_methods, slot) \
(*(binaryfunc*)(& ((char*)nb_methods)[slot]))

我的知识从那里开始,但希望这提供了一些见解。