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

голоса
11

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

Задан 09/12/2008 в 23:07
источник пользователем
На других языках...                            


4 ответов

голоса
24

Определение питоной грамматики (из которой анализатор генерируется с использованием Pgen ), обратите внимание на «власть»: Gramar / Gramar

Питон аст, искать 'ast_for_power': Python / ast.c

Питон 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 объекты / longobject.c , для Int объектов (в 2.х ветви) это реализовано в функции int_pow объекта / 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 из Справочника Applied Cryptography , который описывает эффективные алгоритмы экспоненциации для произвольной точности арифметических действий .

Ответил 10/12/2008 в 00:33
источник пользователем

голоса
1

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

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

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

Я свиноматки описания этого материала где-нибудь еще в питоне документ, но я не могу вспомнить.

Ответил 10/12/2008 в 00:47
источник пользователем

голоса
1

Есть два различных реализаций один для Int (длиной в 3.0) объекты, а другой для объектов с плавающей точкой.

Поплавок пау является float_pow (PyObject * v, PyObject * ш, PyObject * г) функция, определенная в объекты / floatobject.c файл исходного кода Python. Эта функция вызывает Pow () из math.h C STDLIB в

INT пау имеет свою собственную реализацию, является функцией int_pow (PyIntObject * v, PyIntObject * ш, PyIntObject * г) определена в объектах / intobject.c (longobject.c для 3.0) исходного кода Python.

Ответил 10/12/2008 в 00:32
источник пользователем

голоса
1

Это сила оператору

python.org док - оператор питания

Edit: О, черт побери, код, право. Надеюсь, что связь все еще помогает. Слоппите чтение с моей стороны

Ответил 09/12/2008 в 23:10
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more