快速将bytes转换为int的方法
项目上需要快速将网络接收的bytes数据转换为16bit 整形数,网上查过很多资料,一般都是用int.from_bytes函数实现,实验发现,这个函数进行大批量转换时很慢,怎样能加快转换速度呢?
想到用numpy的tofile函数将bytes存入文件,再用fromfile函数将数据从文件中读出,经测试可行,时间缩短很多,数据量越大节约的时间越多,分享给大家。
import numpy as np
import time
a = bytes([0x1a, 0x2b, 0x3c, 0x4d, 0x5e, 0x6f, 0x7a, 0x8b]) * 8192
## 方法一:先写入文件,再按格式读出
t1 = time.perf_counter()
c = np.array(a)
with open('data.dat', 'wb+') as fs:
c.tofile('data.dat')
b1 = np.fromfile('data.dat', dtype=np.int16)
t2 = time.perf_counter()
print("方法一耗时: %.2f ms" % ((t2 - t1)*1000))
### 方法二:用int.from_byes函数转换
t1 = time.perf_counter()
len = int(len(a) / 2)
b2 = []
for i in range(len):
data = int.from_bytes([a[2 * i],a[2 * i + 1]], 'little', signed=True)
b2.append(data)
t2 = time.perf_counter()
print("方法二耗时: %.2f ms" % ((t2 - t1)*1000))
### 检验两种方法是否一致
b2=np.array(b2)
print("b1 : ",b1, type(b1))
print("b2 : ",b2, type(b2))
for i in range(len):
if b1[i] != b2[i]:
print("b1[%d] != b2[%d]" %(i,i))
测试结果:
方法一耗时: 1.59 ms
方法二耗时: 28.02 ms
b1 : [ 11034 19772 28510 ... 19772 28510 -29830] <class 'numpy.ndarray'>
b2 : [ 11034 19772 28510 ... 19772 28510 -29830] <class 'numpy.ndarray'>
``
在bytes大小为8192*8时,用文件写入法耗时1.59ms,用函数法28ms,数量越大二者相差越大。
说明:
本人用固态硬盘,如果是机械硬盘不知道结果会怎样,家里没有机械硬盘,有机会再验证。`