Как отключить кеширование метода в CPython 2.7.2? - PullRequest
4 голосов
/ 01 декабря 2011

Я пытаюсь реализовать свой собственный метод кеширования. Для этого сначала я хочу отключить существующий кэш методов, реализованный в CPython 2.7.2, так как я также хотел бы сравнить CPython без этого метода.

Я искал код и нашел некоторый код кэша методов в файле '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;

Из того, что я понимаю, если метод не находится в кэше методов, вы пересекаете MRO. Я просто хочу деактивировать весь кеш метода самым чистым способом. Какие-либо предложения? :)

Антонио

1 Ответ

5 голосов
/ 01 декабря 2011

Я думаю, что самым простым способом было бы найти вхождения if (!PyType_HasFeature(type, Py_TPFLAGS_HAVE_VERSION_TAG)) в typeobject.c и заменить !PyType_HasFeature(type, Py_TPFLAGS_HAVE_VERSION_TAG) на 0. Я думаю, что вам нужно изменить 3 строки. Затем отредактируйте макрос #define MCACHE_CACHEABLE_NAME(name) в верхней части файла, чтобы он всегда был ложным.

Тогда просто перекомпилируйте Python и кеш методов исчезнет. Внесения любого из этих изменений было бы достаточно, чтобы остановить работу кэша, но я думаю, что, посмотрев на код, вы захотите, чтобы оба этих компонента перестали выполнять ненужную работу по поддержанию неиспользуемого кэша.

Мой вопрос, однако, заключается в том, что если вы пытаетесь заменить его чем-то другим, то, конечно же, вы все равно работаете над этим кодом, поэтому разве вы не должны просто сначала удалить весь существующий код кэша методов, чтобы дать себе возможность начать все сначала? 1008 *

...