gpt4 book ai didi

python - **在Python中是如何实现的?

转载 作者:太空狗 更新时间:2023-10-29 17:54:54 25 4
gpt4 key购买 nike

我想知道在哪里可以找到显示运算符 ** 如何在 Python 中实现的源代码。有人能指出我正确的方向吗?

最佳答案

python 语法定义(使用 pgen 从中生成解析器),查找 'power': Gramar/Gramar

python ast,寻找'ast_for_power':Python/ast.c

python eval 循环,查找“BINARY_POWER”:Python/ceval.c

调用 PyNumber_Power(在 Objects/abstract.c 中实现):

PyObject *
PyNumber_Power(PyObject *v, PyObject *w, PyObject *z)
{
return ternary_op(v, w, z, NB_SLOT(nb_power), "** or pow()");
}

本质上,调用 pow 插槽。对于长对象(3.0 中唯一的默认整数类型),这是在 long_pow 函数中实现的 Objects/longobject.c ,对于 int 对象(在 2.x 分支中),它在 int_pow 函数中实现 Object/intobject.c

如果深入研究 long_pow,您会发现在检查参数并进行一些设置后,可以在此处看到求幂的核心:

if (Py_SIZE(b) <= FIVEARY_CUTOFF) {
/* Left-to-right binary exponentiation (HAC Algorithm 14.79) */
/* http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf */
for (i = Py_SIZE(b) - 1; i >= 0; --i) {
digit bi = b->ob_digit[i];

for (j = 1 << (PyLong_SHIFT-1); j != 0; j >>= 1) {
MULT(z, z, z)
if (bi & j)
MULT(z, a, z)
}
}
}
else {
/* Left-to-right 5-ary exponentiation (HAC Algorithm 14.82) */
Py_INCREF(z); /* still holds 1L */
table[0] = z;
for (i = 1; i < 32; ++i)
MULT(table[i-1], a, table[i])

for (i = Py_SIZE(b) - 1; i >= 0; --i) {
const digit bi = b->ob_digit[i];

for (j = PyLong_SHIFT - 5; j >= 0; j -= 5) {
const int index = (bi >> j) & 0x1f;
for (k = 0; k < 5; ++k)
MULT(z, z, z)
if (index)
MULT(z, table[index], z)
}
}
}

使用 Chapter 14.6 中讨论的算法的 Handbook of Applied Cryptography描述了任意精度算术的有效求幂算法。

关于python - **在Python中是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/354421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com