python中的更快分数模块

2024-06-26 04:31:05 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 模块decimalfractionscdecimalcfractions
3条回答

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

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

注意:我也是维护者。在

我什么也找不到。 你可以做一个。http://docs.python.org/extending/extending.html

快速搜索c中的分数得到了http://www.spiration.co.uk/post/1400/fractions-in-c -a-rational-arithmetic-library。使用第二个帖子,它也处理负数。在

但这可能不是你需要的,你可以找到其他的东西。如果你不想扩展python,如果你找不到任何一个拥有cFractions模块的人,你就必须坚持使用分数。我很抱歉。在

不幸的是,不需要编译的外部依赖项,就没有可用的c等价物。根据你的需要,我的要点是:https://gist.github.com/mscuthbert/f22942537ebbba2c31d4可能会有所帮助。在

它公开了一个函数opFrac(num),该函数可以选择性地将int、float或Fraction转换为具有分母限制的float或分数(我使用65535,因为我处理的是小分数);如果float可以精确地用二进制表示(即,它是两个分母的某个幂的倍数),则它将不使用它。否则它会将其转换为分数。类似地,如果分数在二进制中完全可以表示,我们就把它转换成一个浮点数;否则我们就不用管它了。在

Fraction(float).limit_denominator(x)调用提取到一个助手函数_preFracLimitDenominator,该函数只创建一个Fraction对象,而不是通常使用该调用创建的三个对象。在

这个要点的用例很少,但是在它们存在的地方,结果是惊人的。在我的项目music21中,我们主要处理的音符通常放在一个拍子(整数)上,或者放在半拍、四分之一、八分之一等拍子上(完全可以用二进制表示),但是在比较少见的情况下,音符有位置(偏移量)或持续时间,比如说,1/3或1/5拍,我们遇到了大的浮点转换问题,导致了一些模糊的错误。我们的测试套件使用浮点偏移和持续时间在350秒内运行。把所有的东西都换成分数,把时间膨胀到1100秒,这是完全不可接受的。切换到具有快速创建分数的可选分数将时间恢复到360秒,或仅降低3%的性能。在

如果你能处理时而使用浮点数,有时又能处理分数的问题,这也许是一种可行的方法。在

相关问题 更多 >