#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 передает массив функции, а также пытается изменить его в другом месте.