Memoize 没有按预期工作?
Memoize not working as expected?
我目前正在学习记忆化。作为一个简单的练习,我用斐波那契实现了记忆。但是我有问题,为什么当我不重命名记忆函数时它完成的速度比我重命名时慢。看一下代码。
这不能正常工作并且不能正确缓存。
function memoize(func) {
const cache = {};
return function(args) {
const cacheKeys = Object.keys(cache).map(el => +el);
if (cacheKeys.includes(args)) {
return cache[args];
}
cache[args] = func(args);
return cache[args];
};
}
function wrapped_fibonacci(n) {
if (n <= 2) {
return 1;
}
return wrapped_fibonacci(n - 1) + wrapped_fibonacci(n - 2);
}
const fibonacci = memoize(wrapped_fibonacci); // <== I do not rename the function.
for (let i = 1; i <= 40; i++) {
console.log(fibonacci(i));
}
但是,当我这样写代码的时候。它工作正常并且性能良好
function memoize(func) {
const cache = {};
return function(args) {
const cacheKeys = Object.keys(cache).map(el => +el);
if (cacheKeys.includes(args)) {
return cache[args];
}
cache[args] = func(args);
return cache[args];
};
}
function fibonacci(n) {
if (n <= 2) {
return 1;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
fibonacci = memoize(fibonacci); //<== I rename the function
for (let i = 1; i <= 40; i++) {
console.log(fibonacci(i));
}
如你所见。我只是重新分配了函数名称。
我正在 node.js v8.3.0
上进行这些测试
第一个的结果就是这样。
time node fib.js
real 0m2.413s │~
user 0m2.400s │~
sys 0m0.008s
第二次的结果是这样
time node fib.js
real 0m0.263s │~
user 0m0.252s │~
sys 0m0.008s
1.8 秒的差异
任何人都可以阐明这一点吗?
在工作示例中,您将 fibonacci
替换为一个也称为 fibonacci
的记忆函数。递归调用正在使用这个记忆函数,因为 fibonacci-the-original
被 fibonacci-the-memoized
取代。
在非工作示例中,您正在从 wrapped_fibonacci
创建一个记忆函数 fibonacci
,但该函数仍然调用 wrapped_fibonacci
,unmemoized 原创,递归。
如果你也替换 wrapped_fibonacci
,它会再次加速:
const fibonacci = wrapped_fibonacci = memoize(wrapped_fibonacci)
我目前正在学习记忆化。作为一个简单的练习,我用斐波那契实现了记忆。但是我有问题,为什么当我不重命名记忆函数时它完成的速度比我重命名时慢。看一下代码。
这不能正常工作并且不能正确缓存。
function memoize(func) {
const cache = {};
return function(args) {
const cacheKeys = Object.keys(cache).map(el => +el);
if (cacheKeys.includes(args)) {
return cache[args];
}
cache[args] = func(args);
return cache[args];
};
}
function wrapped_fibonacci(n) {
if (n <= 2) {
return 1;
}
return wrapped_fibonacci(n - 1) + wrapped_fibonacci(n - 2);
}
const fibonacci = memoize(wrapped_fibonacci); // <== I do not rename the function.
for (let i = 1; i <= 40; i++) {
console.log(fibonacci(i));
}
但是,当我这样写代码的时候。它工作正常并且性能良好
function memoize(func) {
const cache = {};
return function(args) {
const cacheKeys = Object.keys(cache).map(el => +el);
if (cacheKeys.includes(args)) {
return cache[args];
}
cache[args] = func(args);
return cache[args];
};
}
function fibonacci(n) {
if (n <= 2) {
return 1;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
fibonacci = memoize(fibonacci); //<== I rename the function
for (let i = 1; i <= 40; i++) {
console.log(fibonacci(i));
}
如你所见。我只是重新分配了函数名称。 我正在 node.js v8.3.0
上进行这些测试第一个的结果就是这样。
time node fib.js
real 0m2.413s │~
user 0m2.400s │~
sys 0m0.008s
第二次的结果是这样
time node fib.js
real 0m0.263s │~
user 0m0.252s │~
sys 0m0.008s
1.8 秒的差异
任何人都可以阐明这一点吗?
在工作示例中,您将 fibonacci
替换为一个也称为 fibonacci
的记忆函数。递归调用正在使用这个记忆函数,因为 fibonacci-the-original
被 fibonacci-the-memoized
取代。
在非工作示例中,您正在从 wrapped_fibonacci
创建一个记忆函数 fibonacci
,但该函数仍然调用 wrapped_fibonacci
,unmemoized 原创,递归。
如果你也替换 wrapped_fibonacci
,它会再次加速:
const fibonacci = wrapped_fibonacci = memoize(wrapped_fibonacci)