使用元组快速记忆
Fast memoization with tuples
我想使用记忆来加速代码看起来类似于(只调用了少量可能的参数值):
double MyFun(double a,double b,int c,char d)
{
double a = cpu_intensive_pure_function_1(a,c,d);
double b = cpu_intensive_pure_function_2(b,c,d);
return a+b;
}
一种可能是将 args 包装到 Tuple 对象中并使用 Dictionary(新版本的 Dotnet 已经为您完成了元组散列)
Dictionary<Tuple<double,double,int,char>,double> MyFunCache = new Dictionary<Tuple<double,double,int,char>,double> ();
double MyFun(double a,double b,int c,char d)
{
var tmp = Tuple<double,double,int,char>(a,b,c,d);
if(MyFunCache.ContainsKey(tmp))
{
return MyFunCache[tmp];
}
double a = cpu_intensive_pure_function_1(a,c,d);
double b = cpu_intensive_pure_function_2(b,c,d);
return a+b;
}
但这需要在每次调用函数时都创建一个元组对象,这看起来很浪费,有没有更好的方法?已经有论点了吗?
您可以改用 ValueTuple
。另外,请记住在获得计算值后更新缓存:
Dictionary<(double,double,int,char) ,double> MyFunCache = new Dictionary<(double,double,int,char) ,double> ();
double MyFun(double a,double b,int c,char d)
{
var key = (a,b,c,d);
if(MyFunCache.TryGetValue(key, out var cachedResult))
{
return cachedResult;
}
double a = cpu_intensive_pure_function_1(a,c,d);
double b = cpu_intensive_pure_function_2(b,c,d);
MyFunCache.Add(key, a+ b);
return a+b;
}
我想使用记忆来加速代码看起来类似于(只调用了少量可能的参数值):
double MyFun(double a,double b,int c,char d)
{
double a = cpu_intensive_pure_function_1(a,c,d);
double b = cpu_intensive_pure_function_2(b,c,d);
return a+b;
}
一种可能是将 args 包装到 Tuple 对象中并使用 Dictionary(新版本的 Dotnet 已经为您完成了元组散列)
Dictionary<Tuple<double,double,int,char>,double> MyFunCache = new Dictionary<Tuple<double,double,int,char>,double> ();
double MyFun(double a,double b,int c,char d)
{
var tmp = Tuple<double,double,int,char>(a,b,c,d);
if(MyFunCache.ContainsKey(tmp))
{
return MyFunCache[tmp];
}
double a = cpu_intensive_pure_function_1(a,c,d);
double b = cpu_intensive_pure_function_2(b,c,d);
return a+b;
}
但这需要在每次调用函数时都创建一个元组对象,这看起来很浪费,有没有更好的方法?已经有论点了吗?
您可以改用 ValueTuple
。另外,请记住在获得计算值后更新缓存:
Dictionary<(double,double,int,char) ,double> MyFunCache = new Dictionary<(double,double,int,char) ,double> ();
double MyFun(double a,double b,int c,char d)
{
var key = (a,b,c,d);
if(MyFunCache.TryGetValue(key, out var cachedResult))
{
return cachedResult;
}
double a = cpu_intensive_pure_function_1(a,c,d);
double b = cpu_intensive_pure_function_2(b,c,d);
MyFunCache.Add(key, a+ b);
return a+b;
}