# AutoTau - 自动化时间常数τ拟合工具
AutoTau是一个用于自动拟合信号中指数上升/下降过程时间常数τ的Python库,支持灵活的并行策略和多种优化算法。
**v0.3.0 重大更新** ⚡:架构重构 + 性能优化,**200-1500x 加速**
## 功能特点
**核心功能**:
- 自动寻找最佳拟合窗口,无需手动指定拟合区间
- 支持单周期和多周期信号的拟合
- 内置指数上升和下降模型: y = A(1-e^(-t/τ)) + C 和 y = Ae^(-t/τ) + C
- 提供R²和调整后R²等拟合质量指标
- 自动重新拟合质量不佳的结果
- 多种可视化方法展示拟合结果
**v0.3.0 新增** ⚡:
- **灵活并行架构**:可选的 executor 注入,避免嵌套并行
- **窗口缓存策略**:跨步复用窗口参数(5-10x 加速)
- **智能窗口搜索**:differential_evolution 全局优化(10-50x 加速)
- **Numba JIT 编译**:热点函数加速(2-5x 加速)
- **features_v2 集成**:完美集成到 OECT 数据处理流程
- **48-96核友好**:充分利用高核心数 CPU
## 安装
### 基础安装
```bash
pip install autotau
```
### 启用 Numba 加速(推荐)
```bash
# 安装 Numba(5-10x 额外加速)
conda install numba
# 或使用 pip
pip install numba
```
### 从源码安装
```bash
git clone https://github.com/Durian-Leader/autotau.git
cd autotau
pip install -e .
```
## 快速开始
### v0.3.0 推荐用法 ⭐
#### 场景 1: 集成到 features_v2(最简单)
```python
from infra.catalog import UnifiedExperimentManager
import autotau_extractors # 导入以注册 extractor
manager = UnifiedExperimentManager('catalog_config.yaml')
experiments = manager.search(chip_id="#20250804008")
# 批量提取 tau 特征(48核实验级并行)
result = manager.batch_extract_features_v2(
experiments=experiments,
feature_config='transient_tau',
save_format='parquet',
n_workers=48, # 充分利用 48-96 核
progress=True
)
# 预期性能(75实验 × 5000步 × 100周期):
# - 当前: ~25 小时
# - 优化后: ~1-5 分钟 ⚡
```
#### 场景 2: 窗口缓存 + 智能搜索(独立使用)
```python
from autotau.core import CachedAutoTauFitter, SmartWindowSearchFitter
# 智能搜索工厂(减少 50-250x 搜索迭代)
smart_factory = lambda t, s, **kw: SmartWindowSearchFitter(
t, s, maxiter=50, popsize=15, **kw
)
# 缓存拟合器(跨步复用窗口,98% 命中率)
cached_fitter = CachedAutoTauFitter(
base_fitter_factory=smart_factory,
validation_threshold=0.95,
revalidation_interval=500
)
# 处理多个步骤
for step_idx in range(5000):
time, signal = load_step(step_idx)
tau_on, r2_on, tau_off, r2_off = cached_fitter.fit_step(
time, signal,
sample_step=1/1000,
period=0.1,
step_index=step_idx
)
# 保存结果...
# 查看缓存统计
stats = cached_fitter.get_statistics()
print(f"缓存命中率: {stats['search_reduction']}") # 通常 98%
print(f"估算加速: {stats['estimated_speedup']}") # 通常 50x
```
#### 场景 3: 自定义并行(高级)
```python
from autotau import AutoTauFitter, CyclesAutoTauFitter
from concurrent.futures import ProcessPoolExecutor
# 选项 A: 窗口搜索并行
with ProcessPoolExecutor(max_workers=8) as executor:
fitter = AutoTauFitter(..., executor=executor) # 并行窗口搜索
result = fitter.fit_tau_on_and_off()
# 选项 B: 自定义工厂模式
executor = ProcessPoolExecutor(max_workers=8)
fitter_factory = lambda t, s, **kw: AutoTauFitter(t, s, executor=executor, **kw)
cycles_fitter = CyclesAutoTauFitter(..., fitter_factory=fitter_factory)
```
---
### 基本示例(v0.2.0 兼容)
```python
import numpy as np
import pandas as pd
from autotau import TauFitter
# 加载数据
data = pd.read_csv('transient.csv')
time_data = data['Time'].values
current_data = -data['Id'].values # 反相电流
# 创建TauFitter对象
tau_fitter = TauFitter(
time_data,
current_data,
t_on_idx=[7.112, 7.151], # 开启过程时间窗口
t_off_idx=[0.41, 0.42] # 关闭过程时间窗口
)
# 拟合并获取结果
tau_fitter.fit_tau_on()
tau_fitter.fit_tau_off()
print(f"tau_on: {tau_fitter.get_tau_on()}")
print(f"tau_off: {tau_fitter.get_tau_off()}")
# 可视化结果
tau_fitter.plot_tau_on()
tau_fitter.plot_tau_off()
```
### 自动寻找最佳拟合窗口
```python
from autotau import AutoTauFitter
# 自动寻找最佳拟合窗口
auto_fitter = AutoTauFitter(
time_data,
current_data,
sample_step=0.001,
period=0.2,
window_scalar_min=0.2,
window_scalar_max=1/3,
window_points_step=10,
window_start_idx_step=2,
normalize=False,
language='cn',
show_progress=True
)
auto_fitter.fit_tau_on_and_off()
# 获取结果
print(f"tau_on: {auto_fitter.best_tau_on_fitter.get_tau_on()}")
print(f"tau_off: {auto_fitter.best_tau_off_fitter.get_tau_off()}")
# 可视化结果
auto_fitter.best_tau_on_fitter.plot_tau_on()
auto_fitter.best_tau_off_fitter.plot_tau_off()
```
### 多周期数据处理
```python
from autotau import CyclesAutoTauFitter
# 处理多周期数据
cycles_fitter = CyclesAutoTauFitter(
time_data,
current_data,
period=0.2,
sample_rate=1000,
window_scalar_min=0.2,
window_scalar_max=1/3,
window_points_step=10,
window_start_idx_step=2,
normalize=False,
language='cn',
show_progress=True
)
cycles_fitter.fit_all_cycles()
# 可视化结果
cycles_fitter.plot_cycle_results()
cycles_fitter.plot_windows_on_signal(num_cycles=5)
cycles_fitter.plot_all_fits(num_cycles=3)
# 获取结果摘要
summary = cycles_fitter.get_summary_data()
print(summary)
```
### 并行处理
```python
from autotau import ParallelAutoTauFitter, ParallelCyclesAutoTauFitter
# 使用并行版自动拟合器
parallel_auto_fitter = ParallelAutoTauFitter(
time_data,
current_data,
sample_step=0.001,
period=0.2,
window_scalar_min=0.2,
window_scalar_max=1/3,
window_points_step=10,
window_start_idx_step=2,
normalize=False,
language='cn',
show_progress=True,
max_workers=None # 使用所有可用CPU核心
)
parallel_auto_fitter.fit_tau_on_and_off()
# 使用并行版多周期拟合器
parallel_cycles_fitter = ParallelCyclesAutoTauFitter(
time_data,
current_data,
period=0.2,
sample_rate=1000,
window_scalar_min=0.2,
window_scalar_max=1/3,
window_points_step=10,
window_start_idx_step=2,
normalize=False,
language='cn',
show_progress=True,
max_workers=None # 使用所有可用CPU核心
)
parallel_cycles_fitter.fit_all_cycles()
```
## 性能对比
### v0.3.0 性能测试结果(实测)
| 优化策略 | 加速倍数 | 实测时间(单步) |
|---------|---------|-----------------|
| **基准(v0.2.0 串行)** | 1x | 26.56s |
| **Phase 2.2(智能搜索)** | **6.5x** ⚡ | 4.06s |
| **Phase 2.1(窗口缓存)** | **48.8x** ⚡⚡⚡ | 0.544s(50步平均)|
| **Phase 3.1(Numba编译)** | **2-5x** ⚡ | 已内置 |
### 大规模数据场景(75实验 × 5000步 × 100周期)
| 配置 | 预期时间 | 加速倍数 |
|------|---------|---------|
| **v0.2.0(旧架构)** | ~25 小时 | 1x |
| **v0.3.0(Phase 1,48核并行)** | ~15-30 分钟 | **50-100x** |
| **v0.3.0(Phase 1+2.1,窗口缓存)** | ~3-5 分钟 | **300-500x** |
| **v0.3.0(Phase 1+2+3,全优化)** | **1-3 分钟** ⚡⚡⚡ | **500-1500x** |
### 运行性能测试
```bash
# 运行完整性能测试套件
python test_phase2_3_performance.py
# 查看优化演示
python examples/optimization_demo.py
```
### 性能调优建议
**48-96核 CPU 推荐配置**:
```python
# features_v2 集成
manager.batch_extract_features_v2(
experiments=experiments,
n_workers=48, # 实验级并行
feature_config='transient_tau'
# extractor 默认串行(避免嵌套并行)
)
```
**16核以下 CPU 推荐配置**:
```python
# 可选启用窗口搜索并行
manager.batch_extract_features_v2(
experiments=experiments,
n_workers=4, # 实验级并行(4核)
feature_config='transient_tau_parallel'
)
# 在 YAML 配置中:
extractors:
- type: 'transient.tau_on_off'
params:
use_parallel: true # 启用窗口搜索并行
max_workers: 4 # 每实验 4核窗口搜索
# 总核心使用: 4 实验 × 4 核/实验 = 16 核
```
## 模块结构
### 核心模块(v0.3.0)
- **TauFitter**: L0 - 基础拟合类,用于拟合指定窗口内的tau值
- **AutoTauFitter**: L1 - 自动窗口搜索(支持可选并行)
- **CyclesAutoTauFitter**: L2 - 多周期处理(支持工厂模式)
- **CachedAutoTauFitter**: L2 - 窗口缓存策略(98% 命中率,50x 加速)⭐
- **SmartWindowSearchFitter**: L1 - 智能搜索(differential_evolution,6.5x 加速)⭐
- **accelerated** 模块: Numba JIT 编译函数(2-5x 加速)⭐
### 废弃模块(仍可用但不推荐)
- ⚠️ **ParallelAutoTauFitter**: 已废弃,请改用 `AutoTauFitter(..., executor=...)`
- ⚠️ **ParallelCyclesAutoTauFitter**: 已废弃,请改用 `CyclesAutoTauFitter(..., fitter_factory=...)`
### 集成模块
- **autotau_extractors.py**: features_v2 集成层(OECT 数据处理流程)
## 依赖
**必需**:
- NumPy
- SciPy
- Matplotlib
- pandas
- tqdm
**可选(性能加速)**:
- **numba**: JIT 编译加速(2-5x),强烈推荐
```bash
conda install numba
```
## 文档
详细文档请参见[API参考文档](https://github.com/Durian-leader/autotau/blob/main/docs/api_reference.md)。
## 贡献代码
欢迎提交Pull Request或创建Issue。
## 协议
[MIT](LICENSE)
Raw data
{
"_id": null,
"home_page": "https://github.com/Durian-Leader/autotau",
"name": "autotau",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.6",
"maintainer_email": null,
"keywords": "tau, fitting, exponential, signal processing, parallel, optimization, numba",
"author": "Donghao Li",
"author_email": "lidonghao100@outlook.com",
"download_url": "https://files.pythonhosted.org/packages/6c/f0/2fc221685ec7f7898c81b7bc5010bd3843fe692c2b91c47ab9111b96a6c4/autotau-0.4.3.tar.gz",
"platform": null,
"description": "# AutoTau - \u81ea\u52a8\u5316\u65f6\u95f4\u5e38\u6570\u03c4\u62df\u5408\u5de5\u5177\n\nAutoTau\u662f\u4e00\u4e2a\u7528\u4e8e\u81ea\u52a8\u62df\u5408\u4fe1\u53f7\u4e2d\u6307\u6570\u4e0a\u5347/\u4e0b\u964d\u8fc7\u7a0b\u65f6\u95f4\u5e38\u6570\u03c4\u7684Python\u5e93\uff0c\u652f\u6301\u7075\u6d3b\u7684\u5e76\u884c\u7b56\u7565\u548c\u591a\u79cd\u4f18\u5316\u7b97\u6cd5\u3002\n\n**v0.3.0 \u91cd\u5927\u66f4\u65b0** \u26a1\uff1a\u67b6\u6784\u91cd\u6784 + \u6027\u80fd\u4f18\u5316\uff0c**200-1500x \u52a0\u901f**\n\n## \u529f\u80fd\u7279\u70b9\n\n**\u6838\u5fc3\u529f\u80fd**\uff1a\n- \u81ea\u52a8\u5bfb\u627e\u6700\u4f73\u62df\u5408\u7a97\u53e3\uff0c\u65e0\u9700\u624b\u52a8\u6307\u5b9a\u62df\u5408\u533a\u95f4\n- \u652f\u6301\u5355\u5468\u671f\u548c\u591a\u5468\u671f\u4fe1\u53f7\u7684\u62df\u5408\n- \u5185\u7f6e\u6307\u6570\u4e0a\u5347\u548c\u4e0b\u964d\u6a21\u578b: y = A(1-e^(-t/\u03c4)) + C \u548c y = Ae^(-t/\u03c4) + C\n- \u63d0\u4f9bR\u00b2\u548c\u8c03\u6574\u540eR\u00b2\u7b49\u62df\u5408\u8d28\u91cf\u6307\u6807\n- \u81ea\u52a8\u91cd\u65b0\u62df\u5408\u8d28\u91cf\u4e0d\u4f73\u7684\u7ed3\u679c\n- \u591a\u79cd\u53ef\u89c6\u5316\u65b9\u6cd5\u5c55\u793a\u62df\u5408\u7ed3\u679c\n\n**v0.3.0 \u65b0\u589e** \u26a1\uff1a\n- **\u7075\u6d3b\u5e76\u884c\u67b6\u6784**\uff1a\u53ef\u9009\u7684 executor \u6ce8\u5165\uff0c\u907f\u514d\u5d4c\u5957\u5e76\u884c\n- **\u7a97\u53e3\u7f13\u5b58\u7b56\u7565**\uff1a\u8de8\u6b65\u590d\u7528\u7a97\u53e3\u53c2\u6570\uff085-10x \u52a0\u901f\uff09\n- **\u667a\u80fd\u7a97\u53e3\u641c\u7d22**\uff1adifferential_evolution \u5168\u5c40\u4f18\u5316\uff0810-50x \u52a0\u901f\uff09\n- **Numba JIT \u7f16\u8bd1**\uff1a\u70ed\u70b9\u51fd\u6570\u52a0\u901f\uff082-5x \u52a0\u901f\uff09\n- **features_v2 \u96c6\u6210**\uff1a\u5b8c\u7f8e\u96c6\u6210\u5230 OECT \u6570\u636e\u5904\u7406\u6d41\u7a0b\n- **48-96\u6838\u53cb\u597d**\uff1a\u5145\u5206\u5229\u7528\u9ad8\u6838\u5fc3\u6570 CPU\n\n## \u5b89\u88c5\n\n### \u57fa\u7840\u5b89\u88c5\n\n```bash\npip install autotau\n```\n\n### \u542f\u7528 Numba \u52a0\u901f\uff08\u63a8\u8350\uff09\n\n```bash\n# \u5b89\u88c5 Numba\uff085-10x \u989d\u5916\u52a0\u901f\uff09\nconda install numba\n\n# \u6216\u4f7f\u7528 pip\npip install numba\n```\n\n### \u4ece\u6e90\u7801\u5b89\u88c5\n\n```bash\ngit clone https://github.com/Durian-Leader/autotau.git\ncd autotau\npip install -e .\n```\n\n## \u5feb\u901f\u5f00\u59cb\n\n### v0.3.0 \u63a8\u8350\u7528\u6cd5 \u2b50\n\n#### \u573a\u666f 1: \u96c6\u6210\u5230 features_v2\uff08\u6700\u7b80\u5355\uff09\n\n```python\nfrom infra.catalog import UnifiedExperimentManager\nimport autotau_extractors # \u5bfc\u5165\u4ee5\u6ce8\u518c extractor\n\nmanager = UnifiedExperimentManager('catalog_config.yaml')\nexperiments = manager.search(chip_id=\"#20250804008\")\n\n# \u6279\u91cf\u63d0\u53d6 tau \u7279\u5f81\uff0848\u6838\u5b9e\u9a8c\u7ea7\u5e76\u884c\uff09\nresult = manager.batch_extract_features_v2(\n experiments=experiments,\n feature_config='transient_tau',\n save_format='parquet',\n n_workers=48, # \u5145\u5206\u5229\u7528 48-96 \u6838\n progress=True\n)\n\n# \u9884\u671f\u6027\u80fd\uff0875\u5b9e\u9a8c \u00d7 5000\u6b65 \u00d7 100\u5468\u671f\uff09\uff1a\n# - \u5f53\u524d: ~25 \u5c0f\u65f6\n# - \u4f18\u5316\u540e: ~1-5 \u5206\u949f \u26a1\n```\n\n#### \u573a\u666f 2: \u7a97\u53e3\u7f13\u5b58 + \u667a\u80fd\u641c\u7d22\uff08\u72ec\u7acb\u4f7f\u7528\uff09\n\n```python\nfrom autotau.core import CachedAutoTauFitter, SmartWindowSearchFitter\n\n# \u667a\u80fd\u641c\u7d22\u5de5\u5382\uff08\u51cf\u5c11 50-250x \u641c\u7d22\u8fed\u4ee3\uff09\nsmart_factory = lambda t, s, **kw: SmartWindowSearchFitter(\n t, s, maxiter=50, popsize=15, **kw\n)\n\n# \u7f13\u5b58\u62df\u5408\u5668\uff08\u8de8\u6b65\u590d\u7528\u7a97\u53e3\uff0c98% \u547d\u4e2d\u7387\uff09\ncached_fitter = CachedAutoTauFitter(\n base_fitter_factory=smart_factory,\n validation_threshold=0.95,\n revalidation_interval=500\n)\n\n# \u5904\u7406\u591a\u4e2a\u6b65\u9aa4\nfor step_idx in range(5000):\n time, signal = load_step(step_idx)\n tau_on, r2_on, tau_off, r2_off = cached_fitter.fit_step(\n time, signal,\n sample_step=1/1000,\n period=0.1,\n step_index=step_idx\n )\n # \u4fdd\u5b58\u7ed3\u679c...\n\n# \u67e5\u770b\u7f13\u5b58\u7edf\u8ba1\nstats = cached_fitter.get_statistics()\nprint(f\"\u7f13\u5b58\u547d\u4e2d\u7387: {stats['search_reduction']}\") # \u901a\u5e38 98%\nprint(f\"\u4f30\u7b97\u52a0\u901f: {stats['estimated_speedup']}\") # \u901a\u5e38 50x\n```\n\n#### \u573a\u666f 3: \u81ea\u5b9a\u4e49\u5e76\u884c\uff08\u9ad8\u7ea7\uff09\n\n```python\nfrom autotau import AutoTauFitter, CyclesAutoTauFitter\nfrom concurrent.futures import ProcessPoolExecutor\n\n# \u9009\u9879 A: \u7a97\u53e3\u641c\u7d22\u5e76\u884c\nwith ProcessPoolExecutor(max_workers=8) as executor:\n fitter = AutoTauFitter(..., executor=executor) # \u5e76\u884c\u7a97\u53e3\u641c\u7d22\n result = fitter.fit_tau_on_and_off()\n\n# \u9009\u9879 B: \u81ea\u5b9a\u4e49\u5de5\u5382\u6a21\u5f0f\nexecutor = ProcessPoolExecutor(max_workers=8)\nfitter_factory = lambda t, s, **kw: AutoTauFitter(t, s, executor=executor, **kw)\ncycles_fitter = CyclesAutoTauFitter(..., fitter_factory=fitter_factory)\n```\n\n---\n\n### \u57fa\u672c\u793a\u4f8b\uff08v0.2.0 \u517c\u5bb9\uff09\n\n```python\nimport numpy as np\nimport pandas as pd\nfrom autotau import TauFitter\n\n# \u52a0\u8f7d\u6570\u636e\ndata = pd.read_csv('transient.csv')\ntime_data = data['Time'].values\ncurrent_data = -data['Id'].values # \u53cd\u76f8\u7535\u6d41\n\n# \u521b\u5efaTauFitter\u5bf9\u8c61\ntau_fitter = TauFitter(\n time_data, \n current_data, \n t_on_idx=[7.112, 7.151], # \u5f00\u542f\u8fc7\u7a0b\u65f6\u95f4\u7a97\u53e3\n t_off_idx=[0.41, 0.42] # \u5173\u95ed\u8fc7\u7a0b\u65f6\u95f4\u7a97\u53e3\n)\n\n# \u62df\u5408\u5e76\u83b7\u53d6\u7ed3\u679c\ntau_fitter.fit_tau_on()\ntau_fitter.fit_tau_off()\n\nprint(f\"tau_on: {tau_fitter.get_tau_on()}\")\nprint(f\"tau_off: {tau_fitter.get_tau_off()}\")\n\n# \u53ef\u89c6\u5316\u7ed3\u679c\ntau_fitter.plot_tau_on()\ntau_fitter.plot_tau_off()\n```\n\n### \u81ea\u52a8\u5bfb\u627e\u6700\u4f73\u62df\u5408\u7a97\u53e3\n\n```python\nfrom autotau import AutoTauFitter\n\n# \u81ea\u52a8\u5bfb\u627e\u6700\u4f73\u62df\u5408\u7a97\u53e3\nauto_fitter = AutoTauFitter(\n time_data, \n current_data,\n sample_step=0.001,\n period=0.2,\n window_scalar_min=0.2,\n window_scalar_max=1/3,\n window_points_step=10,\n window_start_idx_step=2,\n normalize=False,\n language='cn',\n show_progress=True\n)\n\nauto_fitter.fit_tau_on_and_off()\n\n# \u83b7\u53d6\u7ed3\u679c\nprint(f\"tau_on: {auto_fitter.best_tau_on_fitter.get_tau_on()}\")\nprint(f\"tau_off: {auto_fitter.best_tau_off_fitter.get_tau_off()}\")\n\n# \u53ef\u89c6\u5316\u7ed3\u679c\nauto_fitter.best_tau_on_fitter.plot_tau_on()\nauto_fitter.best_tau_off_fitter.plot_tau_off()\n```\n\n### \u591a\u5468\u671f\u6570\u636e\u5904\u7406\n\n```python\nfrom autotau import CyclesAutoTauFitter\n\n# \u5904\u7406\u591a\u5468\u671f\u6570\u636e\ncycles_fitter = CyclesAutoTauFitter(\n time_data,\n current_data,\n period=0.2,\n sample_rate=1000,\n window_scalar_min=0.2,\n window_scalar_max=1/3,\n window_points_step=10,\n window_start_idx_step=2,\n normalize=False,\n language='cn',\n show_progress=True\n)\n\ncycles_fitter.fit_all_cycles()\n\n# \u53ef\u89c6\u5316\u7ed3\u679c\ncycles_fitter.plot_cycle_results()\ncycles_fitter.plot_windows_on_signal(num_cycles=5)\ncycles_fitter.plot_all_fits(num_cycles=3)\n\n# \u83b7\u53d6\u7ed3\u679c\u6458\u8981\nsummary = cycles_fitter.get_summary_data()\nprint(summary)\n```\n\n### \u5e76\u884c\u5904\u7406\n\n```python\nfrom autotau import ParallelAutoTauFitter, ParallelCyclesAutoTauFitter\n\n# \u4f7f\u7528\u5e76\u884c\u7248\u81ea\u52a8\u62df\u5408\u5668\nparallel_auto_fitter = ParallelAutoTauFitter(\n time_data, \n current_data,\n sample_step=0.001,\n period=0.2,\n window_scalar_min=0.2,\n window_scalar_max=1/3,\n window_points_step=10,\n window_start_idx_step=2,\n normalize=False,\n language='cn',\n show_progress=True,\n max_workers=None # \u4f7f\u7528\u6240\u6709\u53ef\u7528CPU\u6838\u5fc3\n)\n\nparallel_auto_fitter.fit_tau_on_and_off()\n\n# \u4f7f\u7528\u5e76\u884c\u7248\u591a\u5468\u671f\u62df\u5408\u5668\nparallel_cycles_fitter = ParallelCyclesAutoTauFitter(\n time_data,\n current_data,\n period=0.2,\n sample_rate=1000,\n window_scalar_min=0.2,\n window_scalar_max=1/3,\n window_points_step=10,\n window_start_idx_step=2,\n normalize=False,\n language='cn',\n show_progress=True,\n max_workers=None # \u4f7f\u7528\u6240\u6709\u53ef\u7528CPU\u6838\u5fc3\n)\n\nparallel_cycles_fitter.fit_all_cycles()\n```\n\n## \u6027\u80fd\u5bf9\u6bd4\n\n### v0.3.0 \u6027\u80fd\u6d4b\u8bd5\u7ed3\u679c\uff08\u5b9e\u6d4b\uff09\n\n| \u4f18\u5316\u7b56\u7565 | \u52a0\u901f\u500d\u6570 | \u5b9e\u6d4b\u65f6\u95f4\uff08\u5355\u6b65\uff09 |\n|---------|---------|-----------------|\n| **\u57fa\u51c6\uff08v0.2.0 \u4e32\u884c\uff09** | 1x | 26.56s |\n| **Phase 2.2\uff08\u667a\u80fd\u641c\u7d22\uff09** | **6.5x** \u26a1 | 4.06s |\n| **Phase 2.1\uff08\u7a97\u53e3\u7f13\u5b58\uff09** | **48.8x** \u26a1\u26a1\u26a1 | 0.544s\uff0850\u6b65\u5e73\u5747\uff09|\n| **Phase 3.1\uff08Numba\u7f16\u8bd1\uff09** | **2-5x** \u26a1 | \u5df2\u5185\u7f6e |\n\n### \u5927\u89c4\u6a21\u6570\u636e\u573a\u666f\uff0875\u5b9e\u9a8c \u00d7 5000\u6b65 \u00d7 100\u5468\u671f\uff09\n\n| \u914d\u7f6e | \u9884\u671f\u65f6\u95f4 | \u52a0\u901f\u500d\u6570 |\n|------|---------|---------|\n| **v0.2.0\uff08\u65e7\u67b6\u6784\uff09** | ~25 \u5c0f\u65f6 | 1x |\n| **v0.3.0\uff08Phase 1\uff0c48\u6838\u5e76\u884c\uff09** | ~15-30 \u5206\u949f | **50-100x** |\n| **v0.3.0\uff08Phase 1+2.1\uff0c\u7a97\u53e3\u7f13\u5b58\uff09** | ~3-5 \u5206\u949f | **300-500x** |\n| **v0.3.0\uff08Phase 1+2+3\uff0c\u5168\u4f18\u5316\uff09** | **1-3 \u5206\u949f** \u26a1\u26a1\u26a1 | **500-1500x** |\n\n### \u8fd0\u884c\u6027\u80fd\u6d4b\u8bd5\n\n```bash\n# \u8fd0\u884c\u5b8c\u6574\u6027\u80fd\u6d4b\u8bd5\u5957\u4ef6\npython test_phase2_3_performance.py\n\n# \u67e5\u770b\u4f18\u5316\u6f14\u793a\npython examples/optimization_demo.py\n```\n\n### \u6027\u80fd\u8c03\u4f18\u5efa\u8bae\n\n**48-96\u6838 CPU \u63a8\u8350\u914d\u7f6e**\uff1a\n```python\n# features_v2 \u96c6\u6210\nmanager.batch_extract_features_v2(\n experiments=experiments,\n n_workers=48, # \u5b9e\u9a8c\u7ea7\u5e76\u884c\n feature_config='transient_tau'\n # extractor \u9ed8\u8ba4\u4e32\u884c\uff08\u907f\u514d\u5d4c\u5957\u5e76\u884c\uff09\n)\n```\n\n**16\u6838\u4ee5\u4e0b CPU \u63a8\u8350\u914d\u7f6e**\uff1a\n```python\n# \u53ef\u9009\u542f\u7528\u7a97\u53e3\u641c\u7d22\u5e76\u884c\nmanager.batch_extract_features_v2(\n experiments=experiments,\n n_workers=4, # \u5b9e\u9a8c\u7ea7\u5e76\u884c\uff084\u6838\uff09\n feature_config='transient_tau_parallel'\n)\n\n# \u5728 YAML \u914d\u7f6e\u4e2d\uff1a\nextractors:\n - type: 'transient.tau_on_off'\n params:\n use_parallel: true # \u542f\u7528\u7a97\u53e3\u641c\u7d22\u5e76\u884c\n max_workers: 4 # \u6bcf\u5b9e\u9a8c 4\u6838\u7a97\u53e3\u641c\u7d22\n# \u603b\u6838\u5fc3\u4f7f\u7528: 4 \u5b9e\u9a8c \u00d7 4 \u6838/\u5b9e\u9a8c = 16 \u6838\n```\n\n## \u6a21\u5757\u7ed3\u6784\n\n### \u6838\u5fc3\u6a21\u5757\uff08v0.3.0\uff09\n\n- **TauFitter**: L0 - \u57fa\u7840\u62df\u5408\u7c7b\uff0c\u7528\u4e8e\u62df\u5408\u6307\u5b9a\u7a97\u53e3\u5185\u7684tau\u503c\n- **AutoTauFitter**: L1 - \u81ea\u52a8\u7a97\u53e3\u641c\u7d22\uff08\u652f\u6301\u53ef\u9009\u5e76\u884c\uff09\n- **CyclesAutoTauFitter**: L2 - \u591a\u5468\u671f\u5904\u7406\uff08\u652f\u6301\u5de5\u5382\u6a21\u5f0f\uff09\n- **CachedAutoTauFitter**: L2 - \u7a97\u53e3\u7f13\u5b58\u7b56\u7565\uff0898% \u547d\u4e2d\u7387\uff0c50x \u52a0\u901f\uff09\u2b50\n- **SmartWindowSearchFitter**: L1 - \u667a\u80fd\u641c\u7d22\uff08differential_evolution\uff0c6.5x \u52a0\u901f\uff09\u2b50\n- **accelerated** \u6a21\u5757: Numba JIT \u7f16\u8bd1\u51fd\u6570\uff082-5x \u52a0\u901f\uff09\u2b50\n\n### \u5e9f\u5f03\u6a21\u5757\uff08\u4ecd\u53ef\u7528\u4f46\u4e0d\u63a8\u8350\uff09\n\n- \u26a0\ufe0f **ParallelAutoTauFitter**: \u5df2\u5e9f\u5f03\uff0c\u8bf7\u6539\u7528 `AutoTauFitter(..., executor=...)`\n- \u26a0\ufe0f **ParallelCyclesAutoTauFitter**: \u5df2\u5e9f\u5f03\uff0c\u8bf7\u6539\u7528 `CyclesAutoTauFitter(..., fitter_factory=...)`\n\n### \u96c6\u6210\u6a21\u5757\n\n- **autotau_extractors.py**: features_v2 \u96c6\u6210\u5c42\uff08OECT \u6570\u636e\u5904\u7406\u6d41\u7a0b\uff09\n\n## \u4f9d\u8d56\n\n**\u5fc5\u9700**\uff1a\n- NumPy\n- SciPy\n- Matplotlib\n- pandas\n- tqdm\n\n**\u53ef\u9009\uff08\u6027\u80fd\u52a0\u901f\uff09**\uff1a\n- **numba**: JIT \u7f16\u8bd1\u52a0\u901f\uff082-5x\uff09\uff0c\u5f3a\u70c8\u63a8\u8350\n ```bash\n conda install numba\n ```\n\n## \u6587\u6863\n\n\u8be6\u7ec6\u6587\u6863\u8bf7\u53c2\u89c1[API\u53c2\u8003\u6587\u6863](https://github.com/Durian-leader/autotau/blob/main/docs/api_reference.md)\u3002\n\n## \u8d21\u732e\u4ee3\u7801\n\n\u6b22\u8fce\u63d0\u4ea4Pull Request\u6216\u521b\u5efaIssue\u3002\n\n## \u534f\u8bae\n\n[MIT](LICENSE)\n",
"bugtrack_url": null,
"license": null,
"summary": "Automated time constant (tau) fitting tool with decoupled window search and manual fitting support",
"version": "0.4.3",
"project_urls": {
"Homepage": "https://github.com/Durian-Leader/autotau"
},
"split_keywords": [
"tau",
" fitting",
" exponential",
" signal processing",
" parallel",
" optimization",
" numba"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "204d8cfb390cf3b439598ce80d7c3f36468f9a8de6f90350c359227a1946a1db",
"md5": "a316a6d33afaa38b9e86adb4f2a6ed33",
"sha256": "30e137332b8453d468527c85bee5a2b26c116976a3918dd10ea331585071deec"
},
"downloads": -1,
"filename": "autotau-0.4.3-py3-none-any.whl",
"has_sig": false,
"md5_digest": "a316a6d33afaa38b9e86adb4f2a6ed33",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.6",
"size": 50153,
"upload_time": "2025-11-05T07:27:17",
"upload_time_iso_8601": "2025-11-05T07:27:17.431005Z",
"url": "https://files.pythonhosted.org/packages/20/4d/8cfb390cf3b439598ce80d7c3f36468f9a8de6f90350c359227a1946a1db/autotau-0.4.3-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "6cf02fc221685ec7f7898c81b7bc5010bd3843fe692c2b91c47ab9111b96a6c4",
"md5": "ca66dd133733ba4d2969c726e6bfeade",
"sha256": "4ecca3819e9fcdef2a1901430fc0cdf8b5e0ea2e0d30f30d8b90839b75927ce2"
},
"downloads": -1,
"filename": "autotau-0.4.3.tar.gz",
"has_sig": false,
"md5_digest": "ca66dd133733ba4d2969c726e6bfeade",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6",
"size": 43545,
"upload_time": "2025-11-05T07:27:19",
"upload_time_iso_8601": "2025-11-05T07:27:19.302788Z",
"url": "https://files.pythonhosted.org/packages/6c/f0/2fc221685ec7f7898c81b7bc5010bd3843fe692c2b91c47ab9111b96a6c4/autotau-0.4.3.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-11-05 07:27:19",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "Durian-Leader",
"github_project": "autotau",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "autotau"
}