From a270e368c80fd1a902b323320a5e3e010f184bd9 Mon Sep 17 00:00:00 2001 From: boris Date: Sun, 21 Jun 2026 00:47:42 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BC=93=E5=AD=98=E6=97=A5=E5=86=85=E8=82=A1?= =?UTF-8?q?=E7=A5=A8=E8=A1=A8=E8=BE=BE=E5=BC=8F=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fidc-core/src/platform_expr_strategy.rs | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/crates/fidc-core/src/platform_expr_strategy.rs b/crates/fidc-core/src/platform_expr_strategy.rs index 1b7c78b..cfe8cbe 100644 --- a/crates/fidc-core/src/platform_expr_strategy.rs +++ b/crates/fidc-core/src/platform_expr_strategy.rs @@ -517,6 +517,9 @@ pub struct PlatformExprStrategy { prelude_numeric_constants: HashMap, compact_stock_filter_expr: String, stock_filter_quote_usage: StockFilterQuoteUsage, + stock_state_cache_date: RefCell>, + stock_state_cache: + RefCell), StockExpressionState>>, } #[derive(Debug, Clone, PartialEq)] @@ -620,6 +623,8 @@ impl PlatformExprStrategy { prelude_numeric_constants, compact_stock_filter_expr, stock_filter_quote_usage, + stock_state_cache_date: RefCell::new(None), + stock_state_cache: RefCell::new(HashMap::new()), } } @@ -2239,6 +2244,18 @@ impl PlatformExprStrategy { symbol: &str, execution_time: Option, ) -> Result { + { + let mut cache_date = self.stock_state_cache_date.borrow_mut(); + if *cache_date != Some(date) { + self.stock_state_cache.borrow_mut().clear(); + *cache_date = Some(date); + } + } + let cache_key = (date, factor_date, symbol.to_string(), execution_time); + if let Some(state) = self.stock_state_cache.borrow().get(&cache_key) { + return Ok(state.clone()); + } + let market = ctx.data.require_market(date, symbol)?; let feature_market = ctx.data.market(factor_date, symbol).unwrap_or(market); let intraday_same_day_factor = self.config.aiquant_transaction_cost && factor_date == date; @@ -2345,7 +2362,7 @@ impl PlatformExprStrategy { feature_market.volume as f64 }; - Ok(StockExpressionState { + let state = StockExpressionState { symbol: symbol.to_string(), market_cap, market_cap_bn, @@ -2411,7 +2428,11 @@ impl PlatformExprStrategy { .filter(|row| row.symbol == symbol) .map(|row| (row.field.clone(), row.value.clone())) .collect(), - }) + }; + self.stock_state_cache + .borrow_mut() + .insert(cache_key, state.clone()); + Ok(state) } fn eval_scope(