python中的快速分数模块
是否有一个更快的python中的快速分数模块,python,fractions,Python,Fractions,是否有一个更快的分数模块的等价物,类似于分数模块,正如有一个cDecimal模块,它是十进制模块的等价物?模块速度太慢 我什么也找不到。 你可以做一个 快速搜索c中的分数给了我答案。使用第二个post,它也处理负数 但这可能不是你需要的,你可以找到别的东西。如果您不想扩展python,那么如果找不到任何具有cFractions模块的人,就必须坚持使用分数。对不起。使用 它使用GMP多精度库进行快速整数和有理数运算 注意:我也是维护者。不幸的是,如果不需要编译的外部依赖项,就没有c等价物可用。根据
分数
模块的等价物,类似于分数
模块,正如有一个cDecimal
模块,它是十进制
模块的等价物?模块速度太慢 我什么也找不到。
你可以做一个
快速搜索c中的分数给了我答案。使用第二个post,它也处理负数
但这可能不是你需要的,你可以找到别的东西。如果您不想扩展python,那么如果找不到任何具有cFractions模块的人,就必须坚持使用分数。对不起。使用
它使用GMP多精度库进行快速整数和有理数运算
注意:我也是维护者。不幸的是,如果不需要编译的外部依赖项,就没有c等价物可用。根据你的需要,我的要点是:可能会有帮助
它公开了一个函数opFrac(num)
,该函数可以选择将int、float或分数转换为具有分母限制的float或分数(我使用65535,因为我使用的是小分数);如果浮点数可以精确地用二进制表示(即,它是两个分母的某个幂的倍数),那么它就不使用浮点数了。否则,它会将其转换为分数。类似地,如果分数可以用二进制表示,我们就把它转换成浮点数;否则我们就别管它了
分数(float).limit\u分母(x)
调用被提取到辅助函数\u preFracLimitDenominator
,该函数只创建一个分数
对象,而不是通常通过调用创建的三个对象
这个要点的用例非常少,但是如果它们存在,结果是惊人的。在我的项目music21中,我们主要处理的音符通常放在一个节拍(整数)或半节拍、四分之一节拍、八分之一节拍等节拍上(完全可以用二进制表示),但在较少见的情况下,当音符有位置(偏移)或持续时间,即节拍的1/3或1/5,我们遇到了很大的浮点转换问题,导致了一些模糊的错误。我们的测试套件使用浮点偏移量和持续时间在350秒内运行。把所有的东西都换成分数会使时间膨胀到1100秒,这是完全不可接受的。切换到具有快速分数创建功能的可选分数将时间恢复到360秒,或者只有3%的性能命中率
如果您能够处理有时使用浮点数,有时使用分数的问题,那么这可能是一条可行的道路。我也在为缺少此软件包而挣扎,并决定实现一个名为(源代码可用)的软件包
我们只需要安装它
/path/to/python3-m pip安装cfractions
然后在模块中用分数替换分数,就这么简单了
主要特点包括
- 更少的内存
>>> from cfractions import Fraction
>>> import sys
>>> sys.getsizeof(Fraction())
32
相比
>>> from fractions import Fraction
>>> import sys
>>> sys.getsizeof(Fraction())
48
所以它基本上是一个普通的Python对象
+2
分子和分母指针
- 更快:
- 从
int
- 从单个
float
n
实例的总和
n
实例的乘积
或者如果我们看看相对性能
我们可以看到分数。分数飞涨,耶李>
注意:我正在使用的所有基准测试都运行在Python3.9.4
上
Python3.5+
支持
- 纯Python C API,无其他依赖项
- 从分子/分母对构造,单个
int
/float
/anynumber.Rational
值
- 算术和比较运算的全谱
- 字符串表示法(包括
\uuuuu repr\uuuu
和\uuuu str\uuuu
)
pickle
ing和copy
ing
- 不可变性和散列性
- 使用
int
和float
操作(对于后者,将Fraction
实例转换为float
,就像对fracts.Fraction
一样)
PyPy
支持(通过返回到分数.Fraction
代理)
- 使用的所有操作的基于属性的测试
它不包括什么
- 从字符串构造
- 使用
复合体操作
制作一个似乎并不容易,因为我不知道如何像在python中那样处理C语言中任意长的数字。第二个链接也有同样的问题——只要分子和分母都在4位以内(或最多8位),它才有效。好吧,我的数学不是很好:P我刚刚给了你一些我发现的;)看起来很神奇——有没有办法在gmpy2中创建一个类似mpr但支持repr和其他分数特性的分数类。分数?我希望能够进行有条件的导入——如果存在gmpy2,那么“从gmpy2导入分数”或者“从分数导入分数”?cDecimal
被设计为完全替代Decimal
,因此使用相同的名称是有意义的。gmpy2
中的mpq
类型尝试提供与Fraction
类型相同的功能,但它使用了repr
的真实类型名。由于许可原因,gmpy2
不能包含在Python中,因此我计划保持名称的不同。您可以编写一个简单的包装器类来更改格式。谢谢您的建议。我没有意识到许可证的区别。