autotau


Nameautotau JSON
Version 0.4.3 PyPI version JSON
download
home_pagehttps://github.com/Durian-Leader/autotau
SummaryAutomated time constant (tau) fitting tool with decoupled window search and manual fitting support
upload_time2025-11-05 07:27:19
maintainerNone
docs_urlNone
authorDonghao Li
requires_python>=3.6
licenseNone
keywords tau fitting exponential signal processing parallel optimization numba
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 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"
}
        
Elapsed time: 1.02018s