moduleのより高速な同等物であるモジュールがあるのと同じように、モジュールfractions
のようなより高速なモジュールの同等物はありますか? モジュールが遅すぎる。cFractions
cDecimal
Decimal
fractions
4 に答える
私もこのパッケージがないことに苦労していたので、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
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
に変換して)、Fraction
float
fractions.Fraction
PyPy
fractions.Fraction
サポート (プロキシにフォールバックすることによる)、Hypothesis
フレームワークを使用したすべての操作のプロパティベースのテスト。
含まれないもの
- で動作し
complex
ます。
残念ながら、コンパイルされた外部依存関係を必要とせずに利用できる 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 つのオブジェクトではなく、_preFracLimitDenominator
1 つのオブジェクトのみが作成されます。Fraction
この要点のユースケースはかなり少ないですが、存在する場合、結果は目を見張るものがあります。私のプロジェクト music21 では、通常は 1/2 拍、1/4 拍、8 拍などの拍 (2 進数で正確に表現可能) に配置される音符を主に使用しますが、音符に配置 (オフセット) またはデュレーション、つまりビートの 1/3 または 1/5 である場合、あいまいなバグにつながる大きな浮動小数点変換の問題に遭遇していました。私たちのテスト スイートは、浮動小数点のオフセットと期間を使用して 350 秒で実行されました。すべてを分数に切り替えると、時間が 1100 秒に膨れ上がりました。まったく受け入れられません。高速 Fraction 作成を使用してオプションの Fraction に切り替えると、時間が 360 秒に戻り、パフォーマンス ヒットはわずか 3% になりました。
フロートや分数を扱うことができる場合は、これが適している可能性があります。
何も見つかりませんでした。あなたはそれを作ることができます。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 に固執する必要があります。ごめんなさい。