Почему int в NumPy не является экземпляром Python int, а NumPy float — экземпляр Python float?

>>> import numbers
>>> import numpy
>>> a = numpy.int_(0)
>>> isinstance(a, int)
False
>>> isinstance(a, numbers.Integral)
True
>>> b = numpy.float_(0)
>>> isinstance(b, float)
True
>>> isinstance(b, numbers.Real)
True

Типы numpy.int_ и numpy.float_ находятся в иерархии абстрактного базового класса Python, но объект np.int_ не является экземпляром встроенного класса int, хотя объект np.float_ относится к экземпляру встроенного типа float. Чем объясняется это явление?

Целые числа в Python могут быть произвольной длины: если вы попробуете распечатать результат type(10 ** 1000), то увидите тип int (единица с тысячей нулей).

int64 в NumPy — целые числа, представленные 8 байтами (от -9223372036854775808 до 9223372036854775807). Например, выражение np.int_(10) ** 1000 будет рассчитано неправильно, зато быстро.

Таким образом, это разные виды чисел; создание производного класса одного от другого несет такой же смысл, как и создание производного класса int от float. Лучше иметь разные типы, чтобы никто не запутался.

Такое разделение необходимо, потому что операции над произвольными значениями целых чисел медленные, а NumPy пытается ускорить вычисления, выбирая наиболее эффективные для машины типы данных.

С другой стороны, плавающая точка и в Python, и в NumPy соответствует стандарту IEEE 754, который поддерживается популярными процессорами.


Спасибо amadan.