gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 02:49:25 25 4
gpt4 key购买 nike

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

安东尼奥

最佳答案

我认为最干净的方法是在 typeobject.c 中找到 if (!PyType_HasFeature(type, Py_TPFLAGS_HAVE_VERSION_TAG)) 的出现并替换 !PyType_HasFeature(type, Py_TPFLAGS_HAVE_VERSION_TAG) 为 0。我认为这是你必须更改的 3 行。然后编辑文件顶部附近的 #define MCACHE_CACHEABLE_NAME(name) 宏,使其始终为 false。

然后重新编译Python,方法缓存就没有了。进行这些更改中的任何一个都足以停止缓存工作,但我认为通过查看代码,您会希望两者都停止它做不必要的工作来维护未使用的缓存。

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

关于python - 如何在 CPython 2.7.2 中停用方法缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8341007/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com