#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 (поскольку итерационный интерфейс создает дополнительные накладные расходы).