Wie wird ** in Python implementiert?

stimmen
11

Ich frage mich, wo ich die Quelle finden zu zeigen, wie der Operator ** ist in Python implementiert. Kann jemand mich in die richtige Richtung?

Veröffentlicht am 09/12/2008 um 23:07
quelle vom benutzer
In anderen Sprachen...                            


4 antworten

stimmen
24

Die Python - Grammatik - Definition (aus denen der Parser erzeugt wird , unter Verwendung von pgen ), suchen Sie nach 'Power': Gramar / Gramar

Die Python ast, sucht 'ast_for_power': Python / ast.c

Die Python eval Schleife, sucht 'BINARY_POWER': Python / ceval.c

Welche Anrufe PyNumber_Power (implementiert in Objekte / abstract.c ):

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

Im Wesentlichen ruft den pow Schlitz. Für lange Gegenstände (der einzige Standard - Integer - Typ in 3.0) diese in dem long_pow Funktion implementiert sind Objekte / longobject.c , für int Objekte (in den Zweigen 2.x) ist es in der int_pow Funktion implementiert Objekt / intobject.c

Wenn Sie in long_pow graben, können Sie sehen, dass nach den Argumenten vetting und ein bisschen eingerichtet tun, kann das Herz der Potenzierung siehe hier:

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)
        }
    }
}

Welche verwendet Algorithmen diskutiert in Kapitel 14.6 des Handbook of Applied Cryptography , die für beliebiger Genauigkeit arithmetische effiziente Potenzierung Algorithmen beschreibt.

Beantwortet am 10/12/2008 um 00:33
quelle vom benutzer

stimmen
1

Ich denke, caseysrandomthoughts über Sternchen an Funktionen Definition fragen.

Sie könnten Antwort auf diese Python doc Seite finden: http://docs.python.org/tutorial/controlflow.html#more-on-defining-functions

Wenn ein endgültiger formaler Parameter der Form ** name vorhanden ist, erhält er ein Wörterbuch alle Keyword-Argumente mit Ausnahme diejenigen enthält, zu einem formalen Parameter entsprechen.

Ich habe Sau Beschreibung dieses Zeug woanders zu Python doc, aber ich kann nicht erinnern.

Beantwortet am 10/12/2008 um 00:47
quelle vom benutzer

stimmen
1

Es gibt zwei verschiedene Implementationen für int (long in 3.0) Objekte und eine weitere für Schwimmer Objekte.

Der Schwimmer ist die pow float_pow (PyObject * v, w * PyObject, PyObject * z) in Funktion definiert Objekte / floatobject.c Datei der Python Quellcode. Diese Funktion ruft pow () von C stdlib der math.h

Die int pow hat seine eigene Implementierung ist die Funktion int_pow (PyIntObject * v, w * PyIntObject, PyIntObject * z), definiert in Objekten / intobject.c (longobject.c für 3.0) des Python Quellcodes.

Beantwortet am 10/12/2008 um 00:32
quelle vom benutzer

stimmen
1

Es ist die Macht Operator

python.org doc - Netzbetreiber

Edit: Oh, dingt, der Code, richtig. Hoffe, dass die Verbindung hilft immer noch. Sloppy Lese aus meinem Teil

Beantwortet am 09/12/2008 um 23:10
quelle vom benutzer

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