Подтвердить что ты не робот

Как реализовано ** на Python?

Мне интересно, где я нахожу источник, чтобы показать, как оператор ** реализован в Python. Может ли кто-нибудь указать мне в правильном направлении?

4b9b3361

Ответ 1

Определение грамматики python (из которого генерируется синтаксический анализатор с помощью pgen), найдите "power": Gramar/Gramar

Python ast, ищите "ast_for_power": Python/ast.c

Цикл eval python, найдите "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)
        }
    }
}

Что использует алгоритмы, обсуждаемые в Глава 14.6 Справочник по прикладной криптографии, который описывает эффективные алгоритмы возведения в степень для арифметики произвольной точности.

Ответ 2

Это сила для оператора

python.org doc - Оператор питания

Изменить: О, данг, код, правильно. Надеюсь, ссылка все же помогает. Sloppy читается с моей стороны

Ответ 3

Существуют две разные реализации для объектов int (long in 3.0), а другая для объектов float.

Float pow - это функция float_pow (PyObject * v, PyObject * w, PyObject * z), определенная в файле Objects/floatobject.c исходного кода Python. Эта функция вызывает pow() из C stdlib math.h

У int pow есть своя реализация, это функция int_pow (PyIntObject * v, PyIntObject * w, PyIntObject * z), определенная в Object/intobject.c(longobject.c для 3.0) исходного кода Python.

Ответ 4

Я думаю, что caseysrandomthoughts спрашивают о звездоцах при определении функций.

Вы можете найти ответ на этой странице документа Python: http://docs.python.org/tutorial/controlflow.html#more-on-defining-functions

Когда присутствует окончательный формальный параметр имени формы **, он получает словарь, содержащий все аргументы ключевого слова, за исключением тех, которые соответствуют формальному параметру.

Я рассказывал об этом материале в другом месте в документе python, но не могу вспомнить.