3

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

4

4 回答 4

4

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

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

注意:我也是维护者。

于 2012-01-13T19:41:23.917 回答
3

我也在为缺少这个包而苦苦挣扎,并决定实现一个名为( Github 上cfractions提供的源代码)。

我们唯一需要的就是安装它

/path/to/python3 -m pip install cfractions

然后在你的模块中替换fractionscfractions,就这么简单。

主要特点包括

  • 更少的内存

    >>> from cfractions import Fraction
    >>> import sys
    >>> sys.getsizeof(Fraction())
    32
    

    相比

    >>> from fractions import Fraction
    >>> import sys
    >>> sys.getsizeof(Fraction())
    48
    

    所以它基本上是一个简单的 Python object+2分子和分母指针。

  • 更快的速度:

    • 从一对构造int 从整数对构造
    • 单人施工float 从单浮子建造
    • 从施工str 从 str 构造
    • n实例 总和n 个实例的总和
    • n实例 的产物,n 个实例的乘积 或者如果我们看一下相对性能 n 个实例的相对乘积 ,我们可以看到fractions.Fraction飙升,耶!

    注意:我正在使用perfplot,所有基准测试都在Python3.9.4.

  • Python3.5+支持,

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

  • 从分子/分母对构造,单个int//float任何numbers.Rational值,str(来自版本1.4.0),

  • 全面的算术和比较运算,

  • 字符串表示(__repr__& __str__),

  • pickleing和copying,

  • 不变性和哈希性,

  • 使用intand操作float(将Fractioninstance 转换为floatfor 后者,因为它是 for fractions.Fraction),

  • PyPy支持(通过回退到fractions.Fraction代理),

  • Hypothesis使用framework对所有操作进行基于属性的测试。

它不包括什么

  • 使用complex.
于 2021-06-03T12:56:50.937 回答
0

不幸的是,在不需要编译的外部依赖项的情况下,没有可用的 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% 的性能损失。

如果您可以处理有时使用浮点数和有时使用分数,这可能是要走的路。

于 2014-06-30T23:08:12.487 回答
0

我什么也找不到。你可以做一个。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。对不起。

于 2012-01-13T17:47:19.213 回答