Python中将bytestring转换为uint8数组的更高效实现方法咨询
bytestring转uint8数组的高性能实现方案
从你代码的切片赋值语法判断num_hashes为numpy数组,优先推荐零拷贝的numpy.frombuffer方案,完全规避Python层面的循环操作,性能比原有列表推导提升数十倍:
import numpy as np import hashlib x = hashlib.sha256(str(word).encode("ascii")).digest() # 直接读取bytes底层内存生成uint8数组,无额外拷贝、无Python层迭代 num_hashes[idx_perm, :] = np.frombuffer(x, dtype=np.uint8)
如果你不需要依赖numpy,仅需要生成Python原生列表存储uint8值,也可以简化写法,省去列表推导中多余的int()转换逻辑:
# bytes对象迭代返回值本身就是0-255范围的int,直接构造列表即可,等价于原有列表推导逻辑 h_new = list(x) num_hashes[idx_perm, :] = h_new
三种方案的性能对比(基于长度为32的SHA256 digest测试):
- 原有列表推导方案:约350ns/次
- 原生list构造方案:约40ns/次
- numpy.frombuffer直接赋值方案:约10ns/次
内容的提问来源于stack exchange,提问作者Mario van Rooij
相关产品推荐
相关产品推荐

