gpt4 book ai didi

python - python @cache 装饰器是如何工作的?

转载 作者:行者123 更新时间:2023-12-05 01:51:52 26 4
gpt4 key购买 nike

我最近了解了 Python 中的缓存装饰器,并对它的工作原理以及它可以轻松应用于任何函数感到惊讶。像我之前的许多其他人一样,我尝试在 C++ 中复制此行为但没有成功(尝试递归计算 Fib 序列)。问题是内部调用没有被缓存。如果我修改原始函数,这不是问题,但我希望它是一个装饰器,以便它可以应用到任何地方。我正在尝试从源代码中破译 Python @cache 装饰器,但无法弄清楚很多,想弄清楚我如何(如果可能的话)在其他地方复制这种行为。

有没有办法缓存内部调用?

这是向 fib 函数添加内存的简单方法。我想要的是构建一个装饰器,以便我可以包装任何功能。就像 Python 中的一样。

class CacheFib {
public:
CacheFib() {}
unsigned long long fib(int n) {

auto hit = cache_pool.find(n);
if (hit != cache_pool.end()) {
return hit->second;
} else if (n <= 1) {
return n;
} else {
auto miss = this->fib(n - 1) + this->fib(n - 2);
cache_pool.insert({n, miss});
return miss;
}
}
std::map<int, int> cache_pool;
};


这种方法会缓存实际调用,这意味着如果我调用 cachedFib(40) ,第二次它将是 O(1)。它实际上不会缓存内部调用以帮助提高性能。

// A PROTOTYPE IMPLEMENTATION 
template <typename Func> class CacheDecorator {
public:
CacheDecorator(Func fun) : function(fun) {}
int operator()(int n) {
auto hit = cache_pool.find(n);
if (hit != cache_pool.end()) {
return hit->second;
} else {
auto miss = function(n);
cache_pool.insert({n, miss});
return miss;
}
}
std::function<Func> function;
std::map<int, int> cache_pool;
};
int fib(int n) {
if (n == 0 || n == 1) {
return n;
} else
return fib(n - 1) + fib(n - 2);
}
//main
auto cachedFib = CacheDecorator<decltype(fib)>(fib);
cachedFib(**);

此外,有关 @cache 装饰器或任何 C++ 实现想法的任何信息都会有所帮助。

最佳答案

因此,正如您所发现的,Python 和 C++ 是不同的语言。

此上下文中的主要区别在于,在 Python 中,函数名称 fib 在运行时查找,即使是递归调用也是如此;同时,在 C++ 中,函数名是在编译时查找的,所以当您的 CacheDecorator 找到它时,已经太晚了。

几种可能性:

  • fib 的查找移动到运行时;您可以通过使用显式函数指针或使其成为动态方法来执行此操作。这些中的任何一个都意味着对 fib 函数进行不同的编码。

  • 某种可怕的、依赖于平台的 hack 来覆盖函数地址表或函数本身的开头。这将是深奥的魔法,尤其是在优化方面;例如,编译器可能会写出函数的多个拷贝,或者可能会将递归调用变成循环。

  • CacheDecorator 的实现作为预处理器宏移到编译时。这可能是保留 python 装饰器意图的最佳方式。

  • 理想情况下,用Python写Python,用C++写C++;每种语言都有自己的习语,通常不会以一对一的方式相互翻译。

    尝试用 C++ 编写 Python 风格的代码总是会导致代码有些陌生,即使在可能的情况下也是如此。流利地使用您所使用的语言的习语会更好。

关于python - python @cache 装饰器是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71934311/

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