是否有fractions
模块的更快等价物,类似于cFractions
模块,就像有cDecimal
模块一样,它比Decimal
更快。模块? fractions
模块太慢了。
答案 0 :(得分:3)
答案 1 :(得分:2)
我也因缺少这个包而苦苦挣扎,并决定实现一个名为 cfractions
(源代码可用 on Github)。
我们唯一需要的是安装它
/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
package,所有基准测试都在 Python3.9.4
上运行。
Python3.5+
支持,
简单的 Python C API,没有额外的依赖,
从分子/分母对构造,单个int
/float
/任意numbers.Rational
值,
完整的算术和比较运算,
字符串表示(__repr__
和 __str__
),
pickle
ing 和 copy
ing,
不变性和哈希性,
使用 int
和 float
操作(对于后者,将 Fraction
实例转换为 float
,就像 fractions.Fraction
一样),
PyPy
支持(通过回退到 fractions.Fraction
代理),
使用 Hypothesis
framework 对所有操作进行基于属性的测试。
不包括的内容
complex
操作。答案 2 :(得分:0)
我找不到任何东西。 你可以制作一个。http://docs.python.org/extending/extending.html
快速搜索c中的分数给了我http://www.spiration.co.uk/post/1400/fractions-in-c---a-rational-arithmetic-library。使用第二篇文章,它也处理负数。
但这可能不是你所需要的,你可以找到别的东西。如果你不想扩展python,你必须坚持使用Fractions,如果你找不到有cFractions模块的人。对不起。
答案 3 :(得分:0)
不幸的是,在没有编译的外部依赖性的情况下,没有c等效可用。根据您的需要,我所做的要点:https://gist.github.com/mscuthbert/f22942537ebbba2c31d4可能会有所帮助。
它公开了一个函数opFrac(num)
,它可以选择将int,float或Fraction转换为带有分母限制的float或Fraction(我使用65535,因为我使用的是小分数);如果浮点数可以用二进制精确表示(即,它是两个分母的某个幂的倍数),那么它就不管它了。否则它会将其转换为分数。类似地,如果Fraction在二进制中是完全可表示的,我们将它转换为float;否则我们就不管它了。
Fraction(float).limit_denominator(x)
调用被提取到辅助函数_preFracLimitDenominator
中,该函数只创建一个Fraction
对象,而不是通常通过调用创建的三个对象。
这个要点的用例很少,但如果它们存在,结果是惊人的。对于我的项目,music21,我们主要使用通常放在节拍(整数)或半音,四分之一,八等等节拍上的音符(完全可以用二进制表示),但是在音符放置时的罕见情况下(偏移量或持续时间,例如,节拍的1/3或1/5,我们遇到了大的浮点转换问题,导致了模糊的错误。我们的测试套件使用浮点偏移和持续时间在350秒内运行。将所有内容切换到分数会使时间膨胀到1100秒 - 这是完全不可接受的。使用快速分数创建切换到可选分数可将时间恢复到360秒,或仅达到3%的性能影响。
如果你有时可以处理漂浮物,有时候使用分数,这可能是你要走的路。