何时适合使用Python的fmean替代mean函数?
statistics.mean()与fmean()的取舍及FASTQ场景下的精度分析
Python 3.8在statistics模块新增了fmean函数,作为现有mean函数的补充,官方说明如下:
将数据转换为浮点数并计算算术平均值。此函数比mean()运行速度更快,且始终返回浮点数。
二者的适用场景
优先用fmean的情况
- 需要始终得到浮点数结果:比如处理浮点数输入的场景(像你的FASTQ错误概率计算),fmean直接输出浮点数,无需额外类型转换
- 追求计算效率:fmean底层直接用浮点数累加,跳过了
mean为兼容多种数值类型(如整数、分数)的逻辑,数据量越大,速度优势越明显 - 输入均为可转换为浮点数的数值,不需要保留分数、Decimal等精确数值类型
必须用mean的情况
- 需要精确的分数/Decimal计算:
mean会根据输入类型返回对应精度的结果(比如输入fractions.Fraction会返回分数,输入decimal.Decimal返回Decimal),而fmean强制转浮点数会丢失精确性 - 输入混合多种数值类型且要求精确计算的场景
FASTQ错误概率计算场景的精度分析
在你处理FASTQ Phred分值转换为错误概率的场景中,fmean和mean的计算精度几乎没有本质差异——你看到的fmean多显示一位小数,只是浮点数的输出格式化差异,核心计算结果是一致的。
原因在于:当输入都是浮点数时,mean底层也是用浮点数累加,但会额外做类型判断;而fmean直接跳过类型兼容步骤,直接用浮点数计算,速度更快,结果的微小显示差异是浮点数本身的特性导致,并非计算精度有区别。
修改后的示例代码(用fmean替代mean):
from statistics import fmean def decode(c): return ord(c) - 33 def phred_to_probability(phred_score): return 10**(-phred_score/10) def raw_q_to_probability(q): return phred_to_probability(decode(q)) qualities = list("3===RONT{{QKLIFGHEH=::::CAAA@BBA@CCC....00002::;IBCHKJIIHHHEGGGHHGIJGFFFFMKKPILMLGGGGGIMNMEB@CBCDEKNMQQSJJMT{UKOKLLEEDEELGKIJKPEBA==>??@@@HD@?@AH?>?>?IIKIPFFEEFFKIEDDCEHFFHIHIKMLPOHQOH") fmean(raw_q_to_probability(q) for q in qualities)
内容的提问来源于stack exchange,提问作者Equation2876
相关产品推荐
相关产品推荐

