# WordCount **Repository Path**: cjh0716/word-count ## Basic Information - **Project Name**: WordCount - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-10-25 - **Last Updated**: 2026-10-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # WordCount 文本统计工具 ![Python](https://img.shields.io/badge/python-3.9%2B-blue) ![tests](https://img.shields.io/badge/tests-339%20passed-brightgreen) ![coverage](https://img.shields.io/badge/coverage-98%25-brightgreen) ## 目录 1. [项目简介](#1-项目简介) 2. [使用方法](#2-使用方法) 3. [文件列表](#3-文件列表) 4. [运行示例](#4-运行示例) 5. [单元测试](#5-单元测试) 6. [性能测试](#6-性能测试) 7. [版本记录](#7-版本记录) ## 1. 项目简介 WordCount 是一个用 Python 编写的文本统计程序,命令格式为 `wc.exe [参数] [文件名]`, 另外提供交互模式和图形界面。 **基础功能**:统计纯英文 txt 文本的**字符数**(`-c`)、**单词数**(`-w`)、**句子数**(`-s`)。 **扩展功能**:统计源代码文件的**代码行、空行、注释行**(`-x`)和总行数(`-l`), 能识别 C/C++/Java/JS、Python、Shell/YAML、HTML/XML、CSS、SQL、Lua 的注释语法, 正确处理字符串中的注释符号、跨行块注释和 Python 文档字符串。 **自行增加的功能**: | 类别 | 功能 | | --- | --- | | 文本分析 | 段落数、平均词长、平均句长、单词频率(柱状图、停用词过滤) | | 批量统计 | 通配符、递归统计目录、按文件名包含/排除、自动跳过二进制文件、多文件合计 | | 输出格式 | 对齐表格、逐行文本、JSON、CSV(可直接用 Excel 打开),可保存到文件 | | 易用性 | 管道/标准输入、交互模式、`.wcrc` 配置文件、中文错误提示与拼写建议 | | 图形界面 | tkinter 窗口:选择文件或粘贴文本、结果表格、频率柱状图、导出 CSV/JSON([详细介绍](#46-图形界面)) | | 性能 | 大文件分块读取(内存占用与文件大小无关)、多进程并行统计 | **工程质量**:339 个单元测试(含基于随机输入的属性测试),代码覆盖率 98%, flake8 代码规范检查,VS Code 中一键运行测试和性能分析;附带 GitHub Actions 持续集成配置 (仓库同步到 GitHub 后,每次提交会自动在 Windows / Linux 上运行测试)。 ## 2. 使用方法 ### 2.1 运行方式 **方式一:打包好的 exe**(不需要安装 Python) ``` wc.exe [参数] [文件名 ...] wcgui.exe 图形界面 ``` **方式二:用 Python 运行**(Python 3.9 及以上,程序本身没有第三方依赖) ``` python wc.py [参数] [文件名 ...] python wcgui.py ``` **自行打包**:运行 `build.bat`,在 `dist\` 下生成 `wc.exe` 和 `wcgui.exe`。 **快速上手**: ``` wc.exe -c file.txt 统计字符数 wc.exe -w file.txt 统计单词数 wc.exe -s file.txt 统计句子数 wc.exe file.txt 同时统计字符、单词、句子 wc.exe -x main.c 统计代码行、空行、注释行 wc.exe -a *.txt 统计全部项目,多个文件自动合计 wc.exe -x -r src --include "*.py" 统计 src 目录下所有 Python 文件 wc.exe -f -n 20 --stopwords article.txt 单词频率前 20 名 wc.exe -a *.txt --format csv -o out.csv 结果保存为 CSV wc.exe -i 交互模式 ``` ### 2.2 参数说明 | 参数 | 说明 | | --- | --- | | `-c`, `--chars` | 统计字符数 | | `-w`, `--words` | 统计单词数 | | `-s`, `--sentences` | 统计句子数 | | `-p`, `--paragraphs` | 统计段落数(以空行分隔) | | `-m`, `--average` | 统计平均词长(字母数/单词)和平均句长(单词数/句子) | | `-l`, `--lines` | 统计总行数(扩展) | | `-x`, `--extended` | 统计代码行、空行、注释行(扩展) | | `-a`, `--all` | 输出以上全部统计结果 | | `-f`, `--frequency` | 输出所有文件中出现次数最多的单词,带占比和柱状图 | | `-n N`, `--top N` | 单词频率显示前 N 个,默认 10,0 表示全部 | | `--stopwords` | 单词频率中忽略 the、a、is 等常见停用词 | | `--lang LANG` | 手动指定注释语法:`c`、`python`、`shell`、`html`、`css`、`sql`、`lua`、`text` | | `-r`, `--recursive` | 递归统计目录下的所有文本文件 | | `-j N`, `--jobs N` | 用 N 个进程并行统计,`0` 表示按 CPU 核数自动选择,默认 1 | | `--include PATTERN` | 只统计文件名匹配的文件,如 `--include "*.py"`,可重复使用 | | `--exclude PATTERN` | 排除文件名或目录名匹配的文件,如 `--exclude "test_*"`,可重复使用 | | `--format` | 输出格式:`table` 表格(默认)、`plain` 逐行文本、`json`、`csv` | | `-o`, `--output` | 把结果保存到文件(CSV 带 BOM,可直接用 Excel 打开) | | `-i`, `--interactive` | 进入交互模式 | | `--gui` | 打开图形界面 | | `--no-config` | 不读取 `.wcrc` 配置文件 | | `-h`, `--help` | 显示帮助 | | `-v`, `--version` | 显示版本号 | - 参数可以组合使用,如 `wc.exe -c -w file.txt`,输出顺序固定为上表顺序。 - 不带任何统计参数时,默认输出字符数、单词数、句子数。 - 不写文件名或文件名写 `-` 时从标准输入读取,可以配合管道使用,如 `type file.txt | wc.exe -w`。 - 支持一次统计多个文件,文件名支持通配符,如 `wc.exe -w *.txt`;统计多个文件时表格和 CSV 末尾有“合计”行。 - 文件编码支持 UTF-8(带或不带 BOM)和 GBK;大文件分块读取,几百 MB 的文件也只占用二十几 MB 内存。 - 递归统计时自动跳过 `.git`、`__pycache__`、`node_modules`、`venv`、`build`、`dist` 等目录, 以及含有 NUL 字节的二进制文件(图片、exe 等)。过滤规则不区分大小写。 - 文件不存在时输出错误信息并继续处理其余文件,程序返回值为 1。 ### 2.3 交互模式 `wc.exe -i` 进入交互模式,可以连续输入命令,不需要每次重新启动程序: | 命令 | 说明 | | --- | --- | | `<参数> <文件>` | 与命令行用法相同,如 `-w -s examples/sample.txt` | | `text <英文文本>` | 直接统计输入的一段文本 | | `set [参数]` | 设置之后每条命令默认附加的参数,如 `set --format csv` | | `unset` | 清除 `set` 设置的参数 | | `cd <目录>` / `ls [目录]` | 切换目录 / 列出文件 | | `help` / `help args` | 显示交互命令帮助 / 全部参数说明 | | `quit` / `exit` | 退出 | 参数写错时只会提示错误,不会退出交互模式。 ### 2.4 配置文件 在当前目录或用户目录下放一个 `.wcrc` 文件,里面写默认参数(空格或换行分隔,`#` 开头为注释), 每次运行时自动加在命令前面,命令行中输入的参数优先。示例见 `examples/wcrc.example`: ``` --format table --exclude "test_*" ``` ### 2.5 错误提示 | 情况 | 提示 | | --- | --- | | 参数拼错 `wc.exe --wrods a.txt` | `错误: 无法识别的参数: --wrods`
`提示: 没有 --wrods 参数,你是不是想用 --words?` | | 参数值拼错 `wc.exe --format jsn a.txt` | `错误: 参数 --format 的值 jsn 无效,可选值: ...`
`提示: 你是不是想用 json?` | | 文件名拼错 `wc.exe examples/sampel.txt` | `无法读取文件 examples/sampel.txt: 文件不存在,你是不是想输入 examples\sample.txt?` | | 统计目录没加 `-r` | `examples 是目录,统计目录请加 -r 参数` | ### 2.6 图形界面 不熟悉命令行的用户可以使用图形界面:双击 `wcgui.exe`,或运行 `python wcgui.py` / `wc.exe --gui`。 界面分为三个区域,按 ① 选择内容 → ② 勾选统计项目 → ③ 查看结果 的顺序使用,详细说明和各功能截图见 [4.6 图形界面](#46-图形界面)。 ![图形界面](docs/images/gui.png) ### 2.7 统计规则 | 项目 | 规则 | | --- | --- | | 字符 | 文本中的所有字符(含空格、标点、换行)。Windows 换行 `\r\n` 与 `\n` 一样记为 1 个字符 | | 单词 | 由字母/数字组成的连续串。词内的撇号、连字符不拆分,如 `don't`、`well-known` 各算 1 个;带小数点或千分位的数字如 `3.14`、`1,000` 算 1 个 | | 句子 | 以 `.` `!` `?` 结尾(其后为空白、引号/括号或文本末尾)。连续标点如 `...`、`?!` 只算一次;`3.14` 中的小数点不算句末;末尾没有标点但含有单词的文字也算 1 句 | | 段落 | 由一个或多个空行分隔、且包含单词的文本块 | | 平均词长 / 平均句长 | 单词字母总数 ÷ 单词数 / 单词数 ÷ 句子数,保留两位小数。多文件的合计行按总数重新计算,而不是把各文件的平均值相加 | | 单词频率 | 不区分大小写,纯数字不计入,次数相同时按字母顺序排列;“占比”是该词占所有参与统计单词的比例 | | 总行数 | 文件的行数,末尾换行符不会多算一行 | | 空行 | 只含空白字符,或只有 1 个可见字符(如单独的 `{`、`}`) | | 注释行 | 含有注释,且注释外最多只有 1 个可见字符,如 `} // end`;块注释覆盖的每一行都算注释行 | | 代码行 | 注释外有 2 个及以上可见字符的行。字符串中的注释符号不算注释 | 注释语法按文件扩展名自动选择,也可以用 `--lang` 手动指定: | 语言 | 扩展名 | 注释 | | --- | --- | --- | | `c`(默认) | `.c` `.cpp` `.h` `.java` `.js` `.ts` `.go` `.cs` 等其他所有文件 | `//`、`/* */` | | `python` | `.py` `.pyw` `.pyi` | `#`,以及单独成句的三引号文档字符串 `"""..."""` | | `shell` | `.sh` `.rb` `.pl` `.r` `.ps1` `.yaml` `.toml` `.ini` 等 | `#` | | `html` | `.html` `.htm` `.xml` `.svg` `.vue` `.md` | `` | | `css` | `.css` | `/* */` | | `sql` | `.sql` | `--`、`/* */` | | `lua` | `.lua` | `--`、`--[[ ]]` | | `text` | `.txt` `.log` `.csv` | 无注释 | Python 中赋值给变量的三引号字符串(如 `s = """..."""`)是代码,只有单独出现的文档字符串才算注释。 ## 3. 文件列表 ``` . ├── wc.py 命令行程序入口 ├── wcgui.py 图形界面程序入口 ├── wordcount/ 程序源代码 │ ├── __init__.py 包定义与版本号 │ ├── counter.py 文本统计:字符/单词/句子/段落、平均长度、单词频率 │ ├── linestats.py 代码行统计:多语言注释识别,总行/代码行/空行/注释行 │ ├── analyzer.py 统计项目注册表;分块累加统计结果 │ ├── report.py 分块读取文件、识别编码、多进程并行,生成统计报告(命令行和图形界面共用) │ ├── files.py 收集待统计文件:通配符、目录递归、过滤、二进制检测 │ ├── formatters.py 输出格式:表格 / 逐行文本 / JSON / CSV │ ├── cli.py 命令行参数解析、标准输入、结果输出 │ ├── interactive.py 交互模式 │ ├── config.py .wcrc 配置文件 │ ├── errors.py 中文错误提示、拼写建议 │ └── gui.py tkinter 图形界面 ├── tests/ 单元测试(pytest) │ ├── test_counter.py 字符/单词/句子/段落/频率统计 │ ├── test_linestats.py 代码行/空行/注释行,各语言注释语法 │ ├── test_cli.py 命令行参数、多文件、编码、输出格式 │ ├── test_formatters.py 表格对齐、合计、JSON/CSV │ ├── test_files.py 目录递归、过滤、二进制文件 │ ├── test_usability.py 标准输入、交互模式、配置文件、错误提示 │ ├── test_gui.py 图形界面 │ ├── test_streaming.py 分块读取与整体读取结果一致、多进程与单进程结果一致 │ └── test_properties.py 基于随机输入的属性测试(Hypothesis) ├── perf/ 性能测试 │ ├── perf_test.py 生成大文件,计时并用 cProfile 分析热点 │ ├── benchmark.py 与旧版本对比耗时和峰值内存 │ └── benchmark_result.md 基准测试结果 ├── examples/ 示例文件 │ ├── sample.txt 英文文本 │ ├── article.txt 英文文章(《小王子》节选) │ ├── sample.c C 源代码 │ ├── sample.py Python 源代码(含文档字符串) │ ├── sample.html HTML │ └── wcrc.example 配置文件示例 ├── docs/images/ 运行截图(v0.2-*.png 为 v0.2 版本,gui-*.png 为图形界面) ├── tools/screenshots.py 自动生成运行截图的脚本 ├── .vscode/ VS Code 运行、调试、测试、性能分析配置 ├── .github/workflows/ GitHub Actions 持续集成配置 ├── build.bat 打包 wc.exe 和 wcgui.exe ├── requirements-dev.txt 开发依赖(pytest、coverage、hypothesis、flake8、pyinstaller、snakeviz) ├── pytest.ini / .flake8 测试和代码规范配置 ├── CHANGELOG.md 更新日志 ├── AI_PROMPTS.md AI 对话提示词 └── README.md 项目说明 ``` ## 4. 运行示例 以下截图都是在 Windows 命令行窗口中实际运行 `wc.exe` 的结果(由 `tools/screenshots.py` 自动截取)。 ### 4.1 示例文件 `examples/sample.txt`: ``` The quick brown fox jumps over the lazy dog. It's a well-known sentence! Did you know it uses every letter of the alphabet? Yes, it does... Pi is about 3.14 and that is fine ``` `examples/sample.c`: ```c /* sample.c * A small program used to demonstrate line statistics. */ #include // Print the numbers from 1 to n void count(int n) { for (int i = 1; i <= n; i++) { printf("%d\n", i); // one number per line } } int main(void) { char *s = "// not a comment"; count(3); /* single-line block comment */ return 0; } // end of main ``` ### 4.2 基础功能:字符数、单词数、句子数 ![基础功能](docs/images/basic.png) 结果说明: - **字符数 174**:3 行文字共 171 个字符,加上 3 个换行符。 - **单词数 34**:`It's`、`well-known`、`3.14` 各算 1 个单词。 - **句子数 5**:第 1 行有两句(`.` 和 `!` 结尾),第 2 行有两句(`?` 和 `...` 结尾,连续的 `...` 只算一次), 第 3 行没有结尾标点也算 1 句;`3.14` 中的小数点不当作句末。 ### 4.3 扩展功能:代码行、空行、注释行 ![扩展功能](docs/images/extended.png) 结果说明: - `sample.c`:注释行 6 行(第 1~3 行块注释、第 6 行 `//` 注释、第 18 行单行块注释、第 20 行 `} // end of main`); 空行 6 行(空白行和只有 `{`、`}` 的行);代码行 8 行。第 10 行虽然带行尾注释但仍是代码行, 第 16 行字符串里的 `//` 不是注释。 - `sample.py`:模块文档字符串、函数文档字符串和 `#` 注释都算注释行;赋值给变量的三引号字符串算代码行。 - `sample.html`:`` 是注释,链接里的 `//` 不是注释。 - 最后一条命令递归统计本项目自己的源代码。 ### 4.4 文本分析与输出格式 ![文本分析](docs/images/analysis.png) ### 4.5 管道、错误提示与交互模式 ![易用性](docs/images/usability.png) ### 4.6 图形界面 图形界面用 Python 自带的 **tkinter** 编写,不需要安装任何第三方库,打包后就是一个独立的 `wcgui.exe`。 它与命令行调用同一套统计代码(`wordcount/report.py` 中的 `build_report`),两边的统计结果完全一致; 界面本身只负责收集用户的选择和展示结果,代码见 `wordcount/gui.py`。 #### 界面布局 ![启动界面](docs/images/gui-start.png) | 区域 | 控件 | 作用 | | --- | --- | --- | | ① 选择要统计的内容 | “添加文件…” / “添加文件夹…” 按钮 | 弹出系统的文件选择对话框,可多选文件;添加文件夹时会**递归统计**其中所有文本文件,自动跳过 `.git`、`node_modules` 等目录和图片、exe 等二进制文件 | | | 文件列表、“移除选中” / “清空” | 查看已添加的文件和文件夹,支持多选后移除;重复添加同一路径会自动忽略 | | | 文本输入框 | 不想保存成文件时,可以直接粘贴一段英文文本进行统计,结果显示为“(输入的文本)” | | ② 统计项目 | 7 个复选框 | 字符数、单词数、句子数、段落数、平均词长/句长、总行数、代码行/空行/注释行,可任意组合;“全选”“全不选”一键切换 | | | 单词频率、前 N 个、忽略停用词 | 统计所有内容中出现最多的单词,可设置显示数量(1~200),可忽略 the、a、is 等常见词 | | | 注释语法下拉框 | 默认按扩展名自动识别,也可以手动指定 C、Python、HTML、SQL 等语法 | | | 包含 / 排除 输入框 | 按文件名过滤,如包含 `*.py`、排除 `test_*`;多个规则用空格或逗号分隔 | | | “开始统计” / “导出结果…” | 开始统计;统计完成后才能导出 | | ③ 统计结果 | 结果表格 | 每个文件一行,数字右对齐;统计多个文件时最后一行是浅蓝色的**合计行**(平均值按总数重新计算,不是简单相加);文件名显示为相对所选文件夹的路径,便于阅读 | | | 单词频率柱状图 | 用 Canvas 绘制横向柱状图,柱子长度与出现次数成正比,并标注次数 | | | 状态栏 | 提示下一步操作、统计进度和结果,无法读取的文件也会在这里提示 | #### 功能演示一:粘贴文本,分析一篇文章 把 `examples/article.txt`(《小王子》节选)粘贴到文本框,勾选段落数和平均词长/句长,显示前 12 个高频词: ![统计输入的文本](docs/images/gui-text.png) 结果与命令行 `wc.exe -c -w -s -p -m -f -n 12 --stopwords examples\article.txt` 完全相同: 1043 个字符、189 个单词、15 个句子、4 个段落;忽略停用词后出现最多的是 drawing(5 次)。 #### 功能演示二:统计一个代码文件夹 添加 `wordcount` 文件夹,只勾选“总行数”和“代码行/空行/注释行”,包含规则填 `*.py`、排除规则填 `__init__.py`: ![统计代码文件夹](docs/images/gui-folder.png) 程序递归找到 11 个 Python 文件,逐个统计后在最后一行给出合计:共 1730 行,其中代码行 1154、空行 311、注释行 265。 Python 的文档字符串(`"""..."""`)被正确识别为注释。 #### 功能演示三:多种文件综合统计 添加 `examples` 文件夹,同时统计文本和代码:表格中 `.txt` 按纯文本统计,`.c`、`.py`、`.html` 分别按各自的注释语法统计; 右侧柱状图汇总了所有文件的单词频率。 ![综合统计](docs/images/gui.png) #### 功能演示四:导出结果 点击“导出结果…”,在保存对话框中选择文件类型: | 格式 | 说明 | | --- | --- | | CSV | 带 BOM 的 UTF-8 编码,**用 Excel 直接双击打开中文不乱码**;包含每个文件的结果、合计行和单词频率表 | | JSON | 便于其他程序读取,包含每个文件、合计和单词频率 | | TXT | 与命令行相同的对齐文本表格,便于粘贴到报告中 | 下图是上一步导出的 CSV 用 Excel 打开的效果: ![导出到 Excel](docs/images/gui-export.png) #### 实现要点 - **界面不卡顿**:统计在后台线程中进行,完成后通过 `root.after` 回到界面线程刷新表格和图表; 选择的文件超过 200 个时自动使用多进程并行统计。 - **高分屏清晰**:启动时调用 Windows 的 `SetProcessDpiAwareness`,在 125%、150% 缩放的屏幕上文字不会发虚。 - **逻辑与界面分离**:文件收集(`gather_sources`)、导出(`export_report`)、路径显示(`short_name`)都是不依赖窗口的普通函数, 可以直接单元测试;窗口本身也在 `tests/test_gui.py` 中用隐藏窗口实际运行,验证统计、合计行、柱状图、错误提示和导出。 ## 5. 单元测试 使用 pytest 编写,共 **339 个测试用例**,代码覆盖率 **98%** (未覆盖的部分是图形界面的主循环和真实终端中的输入提示,这些用实际运行检查)。 ![单元测试](docs/images/tests.png) | 测试文件 | 测试内容 | | --- | --- | | `test_counter.py` | **基础功能**:空文本、纯空白、多空格/换行/Tab、标点与单词相连、撇号与连字符、数字与小数、CRLF 换行、连续标点、引号括号结尾、无结尾标点;段落、平均长度、单词频率与停用词 | | `test_cli.py` | **基础功能**:`-c` `-w` `-s` 各参数、参数组合顺序、默认输出、多文件、通配符、文件不存在、非法参数、UTF-8/BOM/GBK 编码、程序入口;表格/JSON/CSV 输出、保存到文件 | | `test_linestats.py` | **扩展功能**:空行/代码行/注释行判定、`//` 与 `/* */`、多行与未闭合的块注释、字符串中的注释符号、转义引号、Python 文档字符串、HTML/SQL/Lua/CSS、按扩展名选择语言 | | `test_formatters.py` | 中文字符显示宽度、表格对齐、合计行、平均值合计按总数重新计算 | | `test_files.py` | 目录递归、跳过特殊目录和二进制文件、include/exclude 过滤、通配符与递归组合 | | `test_usability.py` | 标准输入与管道、`.wcrc` 解析与优先级、拼写建议、中文错误信息、交互模式各命令 | | `test_gui.py` | 图形界面:用隐藏窗口实际运行统计、合计行、柱状图、错误提示、导出 | | `test_streaming.py` | 分块读取:1 字节到 100 KB 各种分块大小下结果与整体读取一致,跨块的多字节字符、`\r\n`、多行注释;多进程与单进程结果一致 | | `test_properties.py` | **属性测试**:Hypothesis 自动生成随机文本,验证“每行恰好是代码行/空行/注释行之一”“`\n` 与 `\r\n` 结果相同”“两段文本拼接后单词数相加”等规律 | 运行方法: ``` pip install -r requirements-dev.txt python -m pytest -v 运行全部测试 python -m coverage run -m pytest 统计覆盖率 python -m coverage report -m python -m flake8 代码规范检查 ``` 在 VS Code 中:左侧“测试”面板可以直接运行和调试每个测试(已在 `.vscode/settings.json` 中配置 pytest); 也可以按 `Ctrl+Shift+P` → “运行测试任务”,运行“单元测试 + 覆盖率”。 ## 6. 性能测试 ### 6.1 测试方法 使用 VS Code 和 Python 自带的性能分析工具 **cProfile**: | 工具 | 用途 | 在 VS Code 中运行 | | --- | --- | --- | | `perf/perf_test.py` | 生成 10 MB 英文文本和 10 MB C 代码,分别计时各统计函数,并用 cProfile 统计每个函数的调用次数和耗时 | 运行任务“性能测试: 计时 + cProfile”,或在“运行和调试”中选择“性能测试: cProfile 分析” | | snakeviz | 以火焰图的形式查看 cProfile 结果 `perf/wc.prof` | 运行任务“性能测试: 生成 cProfile 文件并用 snakeviz 查看” | | `perf/benchmark.py` | 在独立进程中运行完整程序,测量耗时和峰值内存,并与旧版本(git 标签)对比 | 运行任务“性能测试: 基准对比 (v0.2 vs 当前)” | ### 6.2 cProfile 分析结果 ![cProfile](docs/images/perf.png) ### 6.3 发现的问题与优化 | 问题(cProfile 发现) | 优化方法 | 效果 | | --- | --- | --- | | 代码行统计最初逐个字符扫描,`str.startswith`、`str.isspace` 被调用数千万次 | 用正则表达式直接跳到下一个注释符号或引号,中间的代码整段处理 | 10 MB 代码:1.72 s → 0.96 s | | 大部分代码行不含注释符号和引号,却仍然进入完整的扫描函数 | 增加快速路径:先用一次正则搜索判断,没有特殊符号就直接按长度分类 | 10 MB 代码:0.96 s → 0.77 s | | 统计可见字符数时把整行拆成单词再求和 | 分类只需要知道 0、1 或“大于 1”,改为 `min(len(s.strip()), 2)` | 函数调用减少约 170 万次 | | 整个文件一次性读入内存,50 MB 的文件占用近 600 MB 内存 | 按 256 KB 分块读取,在换行处切分;句子、段落、块注释的状态跨块保存 | 峰值内存 573 MB → 23 MB | | 统计大量小文件时只用了一个 CPU 核 | `-j` 参数用多进程并行统计 | 1000 个文件:1.67 s → 0.62 s | ### 6.4 基准测试结果 ![基准测试](docs/images/benchmark.png) 测试环境:16 核 CPU,Windows 11,Python 3.12;大文件 50 MB,小文件 1000 个 × 20 KB。 | 测试项 | v0.2 耗时 | v0.2 峰值内存 | 当前版本 耗时 | 当前版本 峰值内存 | | --- | --- | --- | --- | --- | | big.txt: -c -w -s | 3.17 s | 573 MB | 3.22 s | 23 MB | | big.txt: -a -f | 不支持 | - | 4.96 s | 26 MB | | big.c: -x | 不支持 | - | 4.11 s | 22 MB | | many files: -a -r | 不支持 | - | 1.67 s | 23 MB | | many files: -a -r -j 0 | 不支持 | - | 0.62 s | 24 MB | v0.2 只有 `-c -w -s` 三个参数,所以其余项目显示“不支持”。在统计功能多了很多的情况下, 基础统计的速度与 v0.2 相当,而内存占用只有原来的 4%,不会再因为文件太大而内存不足。 ## 7. 版本记录 | 版本 | 内容 | | --- | --- | | v0.1 | 空项目:项目结构、`.gitignore`、README | | v0.2 | 基础功能:`-c` 字符数、`-w` 单词数、`-s` 句子数;编码识别;基础功能单元测试([运行截图](docs/images/v0.2-basic.png)、[测试截图](docs/images/v0.2-tests.png)) | | v0.3 | 扩展功能与全部加分项:代码行/空行/注释行;文本分析、批量统计、多种输出格式、交互模式、图形界面;更多单元测试与属性测试;VS Code 性能测试与优化 | 详细变化见 [CHANGELOG.md](CHANGELOG.md)。本项目使用 AI 辅助完成,全部提示词见 [AI_PROMPTS.md](AI_PROMPTS.md)。