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