我正在构建一个参数优化器,它基本上生成配置,对所有配置进行基准测试,收集所有结果,对它们进行排序,然后选择相对于基准测试结果的最佳性能配置。
基准测试本身工作正常,但每次运行需要 50 毫秒和 2 秒,具体取决于配置。关键是,优化程序生成了非常大量的配置,这意味着,在最低端的 100k 和高端的大约 4000 万之间,大约 100 万到 500 万是一个很好的正常范围。显然,单线程版本需要永远,CPU负载实际上非常低,因为任务相对较轻。
我已经设计了基准测试,以使其与并发性很好地配合使用,也就是说,运行器被封装在一个单独的结构(称为代理)中,基准测试本质上是一个将所有状态作为参数的纯函数。从本质上讲,每次运行都会创建自己的状态,然后独立于所有其他运行,但所有函数都使用相同的(引用的)共享数据集。该函数如下所示。
但是,我很难处理每个基准测试的返回值。回到过去,在“缩放”中,我们使用 Async / Await 来实现任务并行性,然后让结果继续。Go 例程,afaik 只能很好地与没有返回值的函数一起使用。在实践中,通道是从戈鲁廷获取值的最自然方式。这就是我正在考虑的关键:
考虑到我通常有>100万个任务,如何正确有效地捕获返回值?
与此相关的是,Golang实际上有一个非常快速的参数优化器吗?对于蟒蛇,我记得optum提供了出色的结果。
谢谢
func (a *Agent) runOptimization(strategyConfigs []cmdb.Config) (result *bmx.OptimizeResult) {
scores := make([]bmx.BackTestResult, len(strategyConfigs))
println("Run all benchmarks")
for i, config := range strategyConfigs {
state := newState(&config)
score := a.runBenchmark(state)
scores[i] = *score // sort only works on actual values
}
println("Sort results")
sort.Sort(bmx.ByTotalPnL(scores))
println("Select best config")
best := scores[len(scores)-1]
println("Generate best strategy config")
stratConf := a.getStrategyConfig(best.PatternConfig)
println("Return optimization results ")
result = &bmx.OptimizeResult{
Symbol: best.Symbol,
StrategyType: best.StrategyType,
OptimizedConfig: &stratConf,
...
}
return result
}
蓝山帝景
缥缈止盈
随时随地看视频慕课网APP
相关分类