mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-06 07:56:52 +08:00
perf: optimize rust acceleration paths
Rust vs Python benchmark results: - RSS: Rust 0.299 ms/loop vs Python 7.913 ms/loop, 26.47x faster - Filter: Rust 12.740 ms/loop vs Python 57.187 ms/loop, 4.49x faster - MetaInfo: Rust 64.680 ms/loop vs Python 316.158 ms/loop, 4.89x faster - Indexer agsvpt: Rust 145.76 ms vs Python 3686.50 ms, 25.29x faster - Indexer pttime: Rust 166.51 ms vs Python 4019.87 ms, 24.14x faster - Indexer chdbits: Rust 161.17 ms vs Python 3604.28 ms, 22.36x faster - Indexer iptorrents: Rust 77.82 ms vs Python 17615.52 ms, 226.36x faster Validation: - cargo fmt/check/test for rust/moviepilot_rust - pytest Rust-related coverage: tests/test_rust_accel.py tests/test_torrent_filter.py tests/test_metainfo.py tests/test_indexer_spider_search_url.py tests/test_workflow_fetch_rss.py - tests/run.py legacy suite - pylint app/ --errors-only
This commit is contained in:
+34
-6
@@ -1,4 +1,5 @@
|
||||
from pathlib import Path
|
||||
from functools import lru_cache
|
||||
from typing import Tuple, List, Optional
|
||||
|
||||
import regex as re
|
||||
@@ -123,12 +124,14 @@ def _build_meta_info(
|
||||
return meta
|
||||
|
||||
|
||||
def _rust_parse_options(custom_words: List[str] = None) -> dict:
|
||||
@lru_cache(maxsize=1)
|
||||
def _rust_default_parse_options() -> dict:
|
||||
"""
|
||||
收集 Rust Meta 解析所需的运行时配置,避免 Rust 层直接访问数据库和 settings。
|
||||
缓存 Rust Meta 默认解析配置,避免热路径反复读取配置并复制流媒体平台大表。
|
||||
"""
|
||||
from app.core.meta.customization import CustomizationMatcher
|
||||
from app.core.meta.releasegroup import ReleaseGroupsMatcher
|
||||
from app.core.meta.streamingplatform import StreamingPlatforms
|
||||
from app.db.systemconfig_oper import SystemConfigOper
|
||||
from app.schemas.types import SystemConfigKey
|
||||
|
||||
@@ -144,17 +147,42 @@ def _rust_parse_options(custom_words: List[str] = None) -> dict:
|
||||
customization = CustomizationMatcher._normalize_customization(
|
||||
systemconfig.get(SystemConfigKey.Customization)
|
||||
)
|
||||
words = custom_words
|
||||
if words is None:
|
||||
words = systemconfig.get(SystemConfigKey.CustomIdentifiers) or []
|
||||
return {
|
||||
"custom_words": words or [],
|
||||
"custom_words": systemconfig.get(SystemConfigKey.CustomIdentifiers) or [],
|
||||
"media_exts": settings.RMT_MEDIAEXT + settings.RMT_SUBEXT + settings.RMT_AUDIOEXT,
|
||||
"release_groups": release_groups,
|
||||
"customization": customization,
|
||||
"streaming_platforms": StreamingPlatforms()._lookup_cache,
|
||||
}
|
||||
|
||||
|
||||
@lru_cache(maxsize=256)
|
||||
def _rust_custom_parse_options(custom_words: Tuple[str, ...]) -> dict:
|
||||
"""
|
||||
缓存带自定义识别词的 Rust Meta 配置,避免同一组识别词重复构造配置对象。
|
||||
"""
|
||||
options = dict(_rust_default_parse_options())
|
||||
options["custom_words"] = list(custom_words)
|
||||
return options
|
||||
|
||||
|
||||
def _rust_parse_options(custom_words: List[str] = None) -> dict:
|
||||
"""
|
||||
收集 Rust Meta 解析所需的运行时配置,避免 Rust 层直接访问数据库和 settings。
|
||||
"""
|
||||
if custom_words is None:
|
||||
return _rust_default_parse_options()
|
||||
return _rust_custom_parse_options(tuple(custom_words or []))
|
||||
|
||||
|
||||
def clear_rust_parse_options_cache() -> None:
|
||||
"""
|
||||
清理 Rust Meta 默认解析配置缓存,供系统配置变更后重载使用。
|
||||
"""
|
||||
_rust_default_parse_options.cache_clear()
|
||||
_rust_custom_parse_options.cache_clear()
|
||||
|
||||
|
||||
def _meta_from_rust(parsed: dict) -> Optional[MetaBase]:
|
||||
"""
|
||||
将 Rust 解析结果灌回现有 MetaVideo/MetaAnime 对象,保留下游属性和方法兼容性。
|
||||
|
||||
Reference in New Issue
Block a user