замороженные числовые массивы, классы данных, numba

#python #numpy #numba

#python #numpy #numba

Вопрос:

Я пытаюсь улучшить качество существующего научного кода, объявляя классы как классы данных, объявляя их frozen=True как можно больше. Одним из намерений является использование JIT numba для ускорения в нескольких местах.

В настоящее время код использует кортежи для хранения небольших постоянных числовых массивов (например, постоянная 3d-координата), но кортежи не объявляют свой размер, не могут быть легко использованы numba и не поддерживают базовую арифметику. Массивы Numpy, с другой стороны, имеют динамически изменяемый размер и могут быть изменены, что затрудняет использование замороженных классов данных.

Я ищу подходящий класс для замороженного числового массива фиксированного размера, который поддерживает базовую арифметику и может использоваться с JIT (with nopython=True ) numba без дальнейших преобразований. Какие-нибудь советы?

Комментарии:

1. Я бы использовал для этого массивы numpy. Если вы действительно хотите, определите класс с @property помощью (но не @property setter), который ссылается на массив, но я не могу себе представить, что это стоило бы накладных расходов.

2. кроме того, если вы раньше не использовали JIT — запустите его как можно раньше. Я не увидел улучшения производительности, которого ожидал от JIT

3. Я не вижу связи между использованием dataclass и numba .

4. Массивы Numpy имеют такой же динамический размер, как и кортежи. Функции изменения размера или объединения создают новые массивы вместо изменения оригиналов. С другой стороны, вы можете объявить массив a неизменяемым с помощью a.flags.writeable = False . Это помогает, когда пользователь API передает массив функции, а также пытается изменить его в другом месте.