如何在CPython 2.7.2中停用方法缓存?

abm*_*ayo 4 python methods caching cpython

我正在尝试实现我自己的方法缓存.为此,首先我要禁用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;
Run Code Online (Sandbox Code Playgroud)

据我所知,如果方法不在方法缓存中,则遍历MRO.我只是想以最干净的方式停用整个方法缓存.有什么建议?:)

安东尼奥

Dun*_*can 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)文件顶部附近的宏始终为false.

然后只需重新编译Python,方法缓存就会消失.进行这些更改中的任何一个都足以阻止缓存工作,但我认为从查看代码时,您希望两者都停止执行维护未使用缓存的不必要工作.

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