作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试实现我自己的类方法缓存。为此,首先我想禁用 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/
我是一名优秀的程序员,十分优秀!