我对Python中%
运算符的时间和空间复杂性感到好奇。此外,Python是否对% 2
使用按位运算?
修改 我问的是Python 2.7的实现,以防它与Python 3略有不同
答案 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]))
我的知识从那里开始,但希望这提供了一些见解。