2012-01-13 5 views
1

Есть ли более быстрый эквивалент fractions модуля, что-то вроде cFractions модуля, так же, как есть cDecimal модуль, который является более быстрым эквивалентом Decimal модуля? Модуль fractions работает слишком медленно.быстрее фракция модуль питона

ответ

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. Прости.

+0

Сделать это непросто, кажется, потому что я не знаю, как бы я обрабатывал сколь угодно большие числа в C, как в python. Такая же проблема со второй ссылкой - она ​​работает только до тех пор, пока числитель и знаменатель находятся в пределах 4 бит (или 8 бит при максимальном). –

+0

Хорошо, я не так хорош в математике: PI просто дал вам то, что я нашел;) – thabubble

3

Использование http://code.google.com/p/gmpy/

Он использует mutliple точности библиотеку GMP для быстрого и рационального целого числа арифметических действий.

Примечание: Я также являюсь сопровождающим.

+0

Это выглядит потрясающе - есть ли способ иметь класс фракций в gmpy2, который работает как mpr, но поддерживает __repr__ и другие особенности фракций. Фракция? Мне бы хотелось иметь возможность делать условный импорт - если gmpy2 существует, то «из gmpy2 import Fraction« else »из фракции import Fraction»? –

+1

'cDecimal' был предназначен для точной замены' Decimal', поэтому с использованием одного и того же имени. Тип 'mpq' в' gmpy2' пытается предложить те же возможности, что и тип 'Fraction', но он использует имя реального типа для' repr'. Поскольку 'gmpy2' не может быть включен в Python по причинам лицензирования, я планирую сохранить имена разными. Вы можете написать простой класс-оболочку, который изменит форматирование. – casevh

+0

Спасибо за предложение. Я не понимал различий в лицензировании. –

0

К сожалению, нет эквивалента c, не требующего скомпилированной внешней зависимости. В зависимости от ваших потребностей сущность, которую я сделал: https://gist.github.com/mscuthbert/f22942537ebbba2c31d4 может помочь.

Он предоставляет функцию opFrac(num), которая опционально преобразует int, float или Fraction в поплавок или фракцию с ограничением знаменателя (я использую 65535, потому что я работаю с небольшими фракциями); если float может быть точно представлен в двоичном виде (т. е. он кратен некоторой мощности двух знаменателей), он оставляет его в покое. В противном случае он преобразует его в фракцию. Аналогично, если фракция точно представима в двоичном выражении, мы преобразуем ее в float; иначе мы оставим это в покое.

Звонок Fraction(float).limit_denominator(x) вызывается в вспомогательную функцию, _preFracLimitDenominator, что создает только один объект Fraction, а не три нормально созданных вызова.

Варианты использования для этого сустава довольно мало, но там, где они существуют, результаты впечатляют. Для моего проекта, music21, мы работаем в основном с нотами, которые обычно помещаются в ритм (целое) или половину, четверть, восьмой и т. Д. Beat (точно представляемые в двоичном формате), но в более редких случаях, когда заметки размещаются (смещение) или длительность, которая составляет, скажем, 1/3 или 1/5 бита, мы столкнулись с большими проблемами преобразования с плавающей запятой, которые привели к неясным ошибкам. Наш набор тестов работал в течение 350 секунд с использованием смещений с плавающей запятой и продолжительности. Переключение всего на Фракции заработало время до 1100 секунд - совершенно неприемлемо. Переключение на дополнительные фракции с быстрым созданием фракций привело к возврату времени на 360 секунд или только к достижению 3% производительности.

Если вы можете иметь дело с иногда работая с поплавками, а иногда и с фракциями, это может быть путь.

Смежные вопросы