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
    /any
    number.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中,因此我计划保持名称的不同。您可以编写一个简单的包装器类来更改格式。谢谢您的建议。我没有意识到许可证的区别。