3

moduleのより高速な同等物であるモジュールがあるのと同じように、モジュールfractionsのようなより高速なモジュールの同等物はありますか? モジュールが遅すぎる。cFractionscDecimalDecimalfractions

4

4 に答える 4

4

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

高速な整数演算と有理数演算に GMP 倍精度ライブラリを使用します。

注:私はメンテナでもあります。

于 2012-01-13T19:41:23.917 に答える
3

私もこのパッケージがないことに苦労していたので、cfractions(ソースコードは 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 整数のペアからの構築
    • シングルからの施工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__)、

  • pickleイングとcopyイング、

  • 不変性とハッシュ可能性、

  • intと を使用して操作する( の場合と同様に、後者の場合はインスタンスをfloatに変換して)、Fractionfloatfractions.Fraction

  • PyPyfractions.Fractionサポート (プロキシにフォールバックすることによる)、

  • Hypothesisフレームワークを使用したすべての操作のプロパティベースのテスト。

含まれないもの

  • で動作しcomplexます。
于 2021-06-03T12:56:50.937 に答える
0

残念ながら、コンパイルされた外部依存関係を必要とせずに利用できる c に相当するものはありません。必要に応じて、私が作成した要点: https://gist.github.com/mscuthbert/f22942537ebbba2c31d4が役立つ場合があります。

オプションで int、float、または Fraction を分母制限付きの float または Fraction に変換する関数を公開しopFrac(num)ます (私は小さな分数を扱っているため、65535 を使用します)。float が 2 進数で正確に表現できる場合 (つまり、2 の累乗の分母の倍数である場合)、そのままにしておきます。それ以外の場合は Fraction に変換されます。同様に、Fraction がバイナリで正確に表現できる場合は、それを float に変換します。それ以外の場合は、そのままにしておきます。

Fraction(float).limit_denominator(x)呼び出しはヘルパー関数 に抽出され、呼び出しで通常作成される 3 つのオブジェクトではなく、_preFracLimitDenominator1 つのオブジェクトのみが作成されます。Fraction

この要点のユースケースはかなり少ないですが、存在する場合、結果は目を見張るものがあります。私のプロジェクト music21 では、通常は 1/2 拍、1/4 拍、8 拍などの拍 (2 進数で正確に表現可能) に配置される音符を主に使用しますが、音符に配置 (オフセット) またはデュレーション、つまりビートの 1/3 または 1/5 である場合、あいまいなバグにつながる大きな浮動小数点変換の問題に遭遇していました。私たちのテスト スイートは、浮動小数点のオフセットと期間を使用して 350 秒で実行されました。すべてを分数に切り替えると、時間が 1100 秒に膨れ上がりました。まったく受け入れられません。高速 Fraction 作成を使用してオプションの Fraction に切り替えると、時間が 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が表示されました。2番目の投稿を使用してください。負の数も処理します。

しかし、それはあなたが必要としているものではないかもしれませんし、何か他のものを見つけることができます. Python を拡張したくない場合は、cFractions モジュールを持っている人が見つからなければ、Fractions に固執する必要があります。ごめんなさい。

于 2012-01-13T17:47:19.213 に答える