Domanda

Sto cercando di implementare la mia propria cache metodo di genere. Per questo, prima di tutto voglio disabilitare la cache metodo esistente implementato in CPython 2.7.2, dal momento che vorrebbe anche punto di riferimento CPython senza questo metodo di cache.

Sono stato alla ricerca nel codice e ha trovato un po 'di codice di metodo di cache nel file 'typeobject.c':

/* Internal API to look for a name through the MRO.
   This returns a borrowed reference, and doesn't set an exception! */
PyObject *
_PyType_Lookup(PyTypeObject *type, PyObject *name)
{
    Py_ssize_t i, n;
    PyObject *mro, *res, *base, *dict;
    unsigned int h;

    if (MCACHE_CACHEABLE_NAME(name) &&
        PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG)) {
        /* fast path */
        h = MCACHE_HASH_METHOD(type, name);
        if (method_cache[h].version == type->tp_version_tag &&
            method_cache[h].name == name)
            return method_cache[h].value;
    }

    /* Look in tp_dict of types in MRO */
    mro = type->tp_mro;

Da quanto ho capito, se il metodo non è nella cache metodo, si attraversa il MRO. Voglio semplicemente disattivare l'intera cache metodo, nel modo più pulito. Eventuali suggerimenti? :)

Antonio

È stato utile?

Soluzione

Credo che il modo più pulito sarebbe quello di trovare le occorrenze di if (!PyType_HasFeature(type, Py_TPFLAGS_HAVE_VERSION_TAG)) in typeobject.c e sostituire !PyType_HasFeature(type, Py_TPFLAGS_HAVE_VERSION_TAG) con 0. Credo che sia 3 linee che si dovrebbe cambiare. Quindi modificare la macro #define MCACHE_CACHEABLE_NAME(name) vicino alla parte superiore del file per essere sempre falso.

Poi basta ricompilare Python e la cache metodo sarà andato. Fare una di queste modifiche sarebbe sufficiente a fermare il lavoro di cache, ma penso che dal guardando il codice si vorrebbe entrambi per fermarlo facendo un lavoro inutile mantenere la cache inutilizzata.

La mia domanda però sarebbe se si sta cercando di sostituirlo con qualcosa d'altro allora sicuramente il vostro lavoro su quel codice in ogni caso, quindi non dovrebbe essere solo rimuovendo tutto il codice metodo di cache esistente prima di concederti una partenza pulita?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top