Вопрос

Я пытаюсь реализовать свой собственный кеш методов. Для этого сначала я хочу отключить существующий кэш метода, реализованный в 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. Я просто хочу деактивировать весь кеш метода самым чистым способом. Какие-либо предложения? :)

Антонио

Это было полезно?

Решение

Я думаю, что самым чистым способом было бы найти происшествия 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, и кэш методов исчезнет. Внесение любого из этих изменений было бы достаточным, чтобы остановить работу кэша, но я думаю, что, посмотрев на код, вы бы хотели, чтобы оба прекратили, выполняя ненужную работу, поддерживая неиспользованный кэш.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top