Python 优化存储和精度

优化存储

优化没有通用规则。我们通常关注性能优化,因为可以使用一些工具(例如大O复杂性度量)来判断算法能否有效地解决给定的问题。通常单独处理存储优化:可以研究算法的流程,并估计不同存储结构所需的存储空间。

在许多情况下,这两种考量是相互对立的。在某些情况下,一个性能非常好的算法可能需要大型数据结构。如果不能大幅增加所需的存储空间,就无法扩展这种算法。我们的目标是设计一种速度快且所用的存储量可接受的算法。

我们可能需要花时间研究算法的替代方法,从而找到一种能合理平衡时空(space-time tradeoff)的方法。在维基百科的链接里可以找到一些通用的优化技术。

Python中的一种内存优化技术是使用可迭代对象。它具有适当实例化集合的一些属性,但不一定占用存储空间。不适用于可迭代对象的运算很少(如len()函数)。对于其他运算,节省内存的特性使得程序可以处理非常大的集合。

优化精度

少数情况下,需要优化计算的精度。这有一定的挑战性,而且可能需要一些相当高级的数学运算来确定给定方法的精度限制。

在Python中,可以用fractions.Fraction值代替浮点近似。对于某些应用,这样做可以得到比浮点数更精确的解,因为相比浮点尾数,分子和分母使用了更多比特。

使用decimal.Decimal值来处理货币十分重要。一种常见的错误是使用float值。当使用float值时,由于作为输入的Decimal值与浮点数使用的二进制近似之间的不匹配,从而引入了额外的噪声位。使用Decimal值可以防止引入微小的误差。

在许多情况下,可以对Python程序进行小的改动,将float值转换为FractionDecimal值。在处理超越函数时,这种改动不一定有用。超越函数的定义涉及无理数。

根据用户需求降低精度

对于某些计算,分数值可能比浮点数更直观,这是以一种用户能理解并做出处理的方式来展示统计结果的一部分。

例如,卡方检验通常涉及计算实际值和预期值之间的 x^2 比较。随后可以用这个比较值来测试 x^2 的累积分布函数。当预期值和实际值没有特定关系(也称“空关系”)时,变化将是随机的,这个值往往很小。当接受了零假设后,需要在其他地方寻找它们的关系。当实际值与期望值区别较大时,我们可能会拒绝零假设,而进一步探索以确定两者关系的准确性质。

对于选定的 x^2 值和给定的自由度,决策通常基于 x^2 累积分布函数(cumulative distribution function,CDF)。尽管表格中的CDF值大多数是无理数,但通常不会保留超过2个或3个小数。它只是一个决策工具,0.049和0.05在实际意义上没有区别。

拒绝零假设广泛使用的概率是0.05,这是一个小于1/20的Fraction对象。在向用户展示数据时,可以将结果描述为分数形式,而像0.05这样的值不怎么直观。用1/20来描述关联的几率有助于人们感知这种关联的可能性。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程