Что касается разницы в производительности, то это кажется логичным: вы применяете векторизованное смещение для одного элемента.Есть огромные накладные расходы, просто достигающие сменной части и изменяющие структуру.нативный код перемещается просто быстрее.
Хорошо, я погуглил сообщение об ошибке, которое вы получаете, когда пытаетесь сделать это на одном элементе, а именно:
>>> a = numpy.uint64(2**60)
>>> a << 3
Traceback (most recent call last):
File "<string>", line 301, in runcode
File "<interactive input>", line 1, in <module>
TypeError: ufunc 'left_shift' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''
, и обнаружил эту проблему с github: https://github.com/numpy/numpy/issues/2524
Это связано с тем, что число смещения преобразуется в тип со знаком, и нет целочисленного типа со знаком, достаточно большого для хранения uint64.
теперь хороший обходной путь (как видно в этом комментарии к выпуску github ) таков:
a << numpy.uint64(1)
(возможно, постройте константу "1" один раз идля всех и используйте его во всем своем коде, чтобы сохранить создание объекта)