Уменьшите точность с плавающей запятой в python, чтобы повысить производительность.

Я работаю с python на Raspberry Pi. Я использую дополнительный фильтр, чтобы получить лучшие значения от гироскопа, но он потребляет слишком много энергии малины - это около 70%. Я думал, что смогу повысить производительность, уменьшив точность с плавающей запятой. Теперь в результатах около 12 знаков после запятой, это больше, чем мне нужно. Есть ли способ установить максимальную точность? Простое округление числа не соответствует моим потребностям, так как это просто еще один расчет. Спасибо!

Редактировать: я пытался использовать модуль Decimal, и с точностью, установленной на 6, он был почти в 6 раз медленнее, чем float! Есть ли другой способ работы с числами с фиксированной точкой, кроме Decimal (похоже, он создан для более высокой точности, чем для производительности)


person ametis    schedule 09.07.2014    source источник
comment
Вам не нравятся числа с плавающей запятой? Что не так с арифметикой с фиксированной точкой?   -  person Willem Van Onsem    schedule 09.07.2014
comment
@CommuSoft: О, я, наверное, что-то неправильно понял. Как я могу установить переменную в python для фиксированной точки? Если я смогу, это будет лучшим решением.   -  person ametis    schedule 09.07.2014
comment
Итак, я попытался использовать Decimal для установки точности... и это даже хуже, чем простое число с плавающей запятой:/   -  person ametis    schedule 09.07.2014
comment
Пробовали ли вы gmpy (aleax.it/gmpy.html)? или cdecimal?   -  person Willem Van Onsem    schedule 09.07.2014


Ответы (2)


Вы можете принудительно выполнить вычисления с плавающей запятой с одинарной точностью, используя numpy.

Тем не менее, я был бы очень удивлен, если бы использование плавающей запятой с одинарной точностью работало быстрее, чем с двойной точностью: Raspberry Pi имеет аппаратную поддержку с плавающей запятой, поэтому я ожидаю, что все вычисления выполняются с полной 80-битной точностью, а затем округляются до 32 бит или 64-битные результаты при сохранении в память. Единственным возможным выигрышем будет немного меньшая пропускная способность памяти, используемая при сохранении значений.

person Duncan    schedule 09.07.2014
comment
Откуда 80-битная точность? - person Diego Herranz; 10.07.2014
comment
80 бит — это расширенная точность, используемая внутри архитектуры x87, чтобы избежать потери точности во время вычислений. Я не знаю, делает ли ARM то же самое или использует только 64 бита внутри. - person Duncan; 10.07.2014

Возможно, у вас не тот конец палки.

Поток данных от гироскопа довольно медленный, поэтому у вас должно быть достаточно времени, чтобы отфильтровать его любым разумным фильтром. Можно использовать даже фильтр Калмана (хотя, вероятно, он и не нужен). Как часто вы сэмплируете данные гироскопа и акселерометра? Разумные максимальные значения составляют несколько сотен герц, не более.

Дополнительный фильтр для измерения акселерометра и гироскопа очень легкий, и сам по себе должен потреблять очень мало вычислительной мощности. Его можно реализовать на медленном 8-битном процессоре, поэтому Raspberry для него слишком быстр.

В зависимости от того, что вы делаете с дополнительным фильтром, самому фильтру требуется несколько операций с плавающей запятой. Если вы вычисляете арктангенсы или эквивалентные функции, это потребует сотни FLOP. Если вы делаете это со скоростью 1 кГц, вы будете потреблять, возможно, несколько сотен кфлопс (операций с плавающей запятой в секунду). Пропускная способность FP RPi составляет примерно 100 MLFOPS, так что запас большой.

Таким образом, снижение точности FP существенно не поможет, проблема в другом. Может быть, если вы покажете немного больше своего кода, можно будет определить, где проблема!

person DrV    schedule 09.07.2014
comment
Частота обновления составляет 10 мс (100 Гц), так что должна быть какая-то серьезная ошибка: / Я снова пересмотрю свой код. - person ametis; 09.07.2014
comment
Хорошо. У меня было плохое состояние в цикле while, и он потреблял всю мощность процессора ... теперь использование составляет около 1-3%. Извини за это. - person ametis; 09.07.2014
comment
@ametis: Не нужно извиняться, жуки ползут. Приятно слышать, что теперь все работает! - person DrV; 09.07.2014