是否有一个更快的fractions
模块等价物,就像一个cFractions
模块一样,就像有一个cDecimal
模块一样,它是一个更快的Decimal
模块等价物?fractions
模块太慢。
4 回答
我也在为缺少这个包而苦苦挣扎,并决定实现一个名为( Github 上cfractions
提供的源代码)。
我们唯一需要的就是安装它
/path/to/python3 -m pip install cfractions
然后在你的模块中替换fractions
为cfractions
,就这么简单。
主要特点包括
更少的内存
>>> from cfractions import Fraction >>> import sys >>> sys.getsizeof(Fraction()) 32
相比
>>> from fractions import Fraction >>> import sys >>> sys.getsizeof(Fraction()) 48
所以它基本上是一个简单的 Python
object
+2
分子和分母指针。更快的速度:
注意:我正在使用
perfplot
包,所有基准测试都在Python3.9.4
.Python3.5+
支持,纯 Python C API,没有额外的依赖,
从分子/分母对构造,单个
int
//float
任何numbers.Rational
值,str
(来自版本1.4.0
),全面的算术和比较运算,
字符串表示(
__repr__
&__str__
),pickle
ing和copy
ing,不变性和哈希性,
使用
int
and操作float
(将Fraction
instance 转换为float
for 后者,因为它是 forfractions.Fraction
),PyPy
支持(通过回退到fractions.Fraction
代理),Hypothesis
使用framework对所有操作进行基于属性的测试。
它不包括什么
- 使用
complex
.
不幸的是,在不需要编译的外部依赖项的情况下,没有可用的 c 等效项。根据您的需要,我提出的要点:https ://gist.github.com/mscuthbert/f22942537ebbba2c31d4可能会有所帮助。
它公开了一个函数opFrac(num)
,可以选择将 int、float 或 Fraction 转换为具有分母限制的 float 或 Fraction(我使用 65535,因为我正在处理小分数);如果浮点数可以精确地用二进制表示(即,它是两个分母的某个幂的倍数),则不用管它。否则,它将其转换为分数。同样,如果 Fraction 可以用二进制精确表示,我们将其转换为浮点数;否则我们就不管它。
该Fraction(float).limit_denominator(x)
调用被提取到一个辅助函数中_preFracLimitDenominator
,该函数仅创建一个Fraction
对象,而不是通常通过调用创建的三个对象。
这个要点的用例很少,但在它们存在的地方,结果是惊人的。对于我的项目music21,我们主要使用通常放置在一个节拍(整数)或半、四分之一、八分之一等节拍上的音符(精确地以二进制表示),但在极少数情况下音符有位置(偏移量)或持续时间,例如 1/3 或 1/5 个节拍,我们遇到了导致模糊错误的大浮点转换问题。我们的测试套件使用浮点偏移和持续时间在 350 秒内运行。将所有内容切换到分数会使时间膨胀到 1100 秒——完全不可接受。切换到具有快速分数创建的可选分数使时间回到 360 秒,或仅降低 3% 的性能损失。
如果您可以处理有时使用浮点数和有时使用分数,这可能是要走的路。
我什么也找不到。你可以做一个。http://docs.python.org/extending/extending.html
快速搜索 c 中的分数给了我http://www.spiration.co.uk/post/1400/fractions-in-c---a-rational-arithmetic-library。使用第二个帖子,它也处理负数。
但这可能不是您需要的,您可以找到其他东西。如果您不想扩展 python,如果您找不到任何拥有 cFractions 模块的人,则必须坚持使用 Fractions。对不起。