EDIT: This question is very outdated! numba now supports Enumand namedtupleout of the box, which provide a reasonable solution for the constant group.
I am doing some bit hipping in python and want to speed it up with numba. To do this, I have many constant integer values that I should handle in a possibly well-readable way. I would like to group them together with enumeration-like objects that have all the constants in the same namespace, accessible with the attribute-get statement. And of course, I would also like numba to understand what is happening there in order to maintain high speeds using jit compilation. My first and most naive attempt, which looked like this:
class SomeConstantsContainer:
SOME_NAME = 0x1
SOME_OTHER_CONSTANT = 0x2
AND_ANOTHER_CONSTANT = 0x4
Unfortunately, when I look at the annotation, it seems like numba doesn't understand that the values are constant, and it always reverts to slow access of objects to python objects. This is stated in the annotation:
# $29.2 = global(SomeConstantsContainer: <class 'constants.SomeConstantContainer'>) :: pyobject
# $29.3 = getattr(attr=SOME_VARIABLE, value=$29.2) :: pyobject
I know that I can always go back to something like this:
from numpy import np
SOME_STUPID_CONSTANT = np.int64(0x1)
ANOTHER_STUPID_CONSTANT = np.int64(0x2)
jit- a) b) , . . . , , jit python . , , ? - enum, numba, ?
:
Enum :
@enum.unique
class SomeConstantsContainer(enum.IntEnum):
SOME_NAME = 0x1
SOME_OTHER_CONSTANT = 0x2
AND_ANOTHER_CONSTANT = 0x4
:
# $42.3 = global(SomeConstantsContainer: <enum 'SomeConstantsContainer'>) :: pyobject
# $42.4 = getattr(attr=SOME_OTHER_CONSTANT, value=$42.3) :: pyobject