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)常に false にします。

次に、Python を再コンパイルするだけで、メソッド キャッシュがなくなります。これらの変更のいずれかを行うと、キャッシュの動作を停止するのに十分ですが、コードを見ると、未使用のキャッシュを維持する不要な作業を停止する必要があると思います。

私の質問は、それを何か他のものに置き換えようとしている場合、とにかくそのコードに取り組んでいるので、最初に既存のメソッドキャッシュコードをすべて削除して、クリーンなスタートを切ることはできませんか?

于 2011-12-01T12:51:40.027 に答える