4

我正在尝试实现我自己的方法缓存。为此,首先我想禁用在 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。我只是想以最干净的方式停用整个方法缓存。有什么建议么?:)

安东尼奥

4

1 回答 1

5

我认为最干净的方法是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,方法缓存就会消失。进行这些更改中的任何一个都足以阻止缓存工作,但我认为通过查看代码,您会希望两者都阻止它做不必要的工作来维护未使用的缓存。

不过,我的问题是,如果您尝试用其他东西替换它,那么肯定您无论如何都在处理该代码,所以您不应该首先删除所有现有的方法缓存代码以让自己有一个干净的开始吗?

于 2011-12-01T12:51:40.027 回答