python中更快的分数模块

时间:2012-01-13 16:54:56

标签: python fractions

是否有fractions模块的更快等价物,类似于cFractions模块,就像有cDecimal模块一样,它比Decimal更快。模块? fractions模块太慢了。

4 个答案:

答案 0 :(得分:3)

使用http://code.google.com/p/gmpy/

它使用GMP多精度库进行快速整数和有理算术。

注意:我也是维护者。

答案 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 分子和分母指针。

  • 更快:

    • 由一对 int 构建 construction from pair of integers
    • 从单个 float 构建 construction from single float
    • n 个实例的总和 sum of n instances
    • n 个实例的乘积 product of n instances 或者如果我们看一下相对表现 relative product of n instances 我们可以看到 fractions.Fraction 飙升,耶!

    注意:我使用的是 perfplot package,所有基准测试都在 Python3.9.4 上运行。

  • Python3.5+ 支持,

  • 简单的 Python C API,没有额外的依赖,

  • 从分子/分母对构造,单个int/float/任意numbers.Rational值,

  • 完整的算术和比较运算,

  • 字符串表示(__repr____str__),

  • pickleing 和 copying,

  • 不变性和哈希性,

  • 使用 intfloat 操作(对于后者,将 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%的性能影响。

如果你有时可以处理漂浮物,有时候使用分数,这可能是你要走的路。