Преобразуйте bytestring в массив uint8 Python

#numpy #performance #multidimensional-array #cryptography #sha

Вопрос:

Мне было интересно, каков самый быстрый способ преобразования байт-теста в массив unit8 в следующем коде? Я использую hashlib для SHA-256

 x = hashlib.sha256(str(word).encode("ascii")).digest()  

Теперь мне нужно преобразовать x в массив uint8. В настоящее время я делаю это с помощью понимания списка, но это кажется медленным.

 h_new = [int(y) for y in x] num_hashes[idx_perm, :] = h_new  

У кого-нибудь есть предложения по более быстрому способу преобразования?

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

1. list(b'123') это пример, но у python нет типа uint8, в то время как у numpy есть. Так чего же ты хочешь?

Ответ №1:

Вы можете использовать функцию frombuffer Numpy. Поскольку размер sha256 всегда составляет 32 байта, а тип вывода хорошо известен, функция может x очень быстро преобразовать входной буфер.

 num_hashes[idx_perm, :] = np.frombuffer(x, np.uint8, 32)  

Это занимает около 0,7 доллара США за вызов на моем компьютере, в то время как начальный код занимает около 3,35 доллара США. Таким образом, эта версия примерно на 4,8 быстрее. Обратите внимание, что это также быстрее, чем преобразование результата в список (из-за множества выделяемых объектов int и подсчета ссылок) и функции from fromiter Numpy (поскольку итерационный интерфейс создает дополнительные накладные расходы).