python整型数据16位_python – 加速将24位二进制数据加载到16位numpy数组中

看来你在这里非常迂回.这不会做同样的事情吗?

output = np.frombuffer(data,'b').reshape(-1,3)[:,1:].flatten().view('i2')

这样可以节省一些时间,从不填充临时数组,跳过bitshift并避免一些不需要的数据移动.不过,我还没有真正对它进行基准测试,我预计节省的成本会很低.

编辑:我现在已经执行了基准测试.对于1200万的len(数据),我的版本为80毫秒,而我的版本为39毫秒,所以几乎可以说是2倍的加速.正如预期的那样,并没有一个很大的改进,但是你的出发点已经非常快了.

编辑2:我应该提到我在这里假设小端.然而,原始问题的代码也隐含地假设小端,所以这不是我的新假设.

(对于大端(数据和体系结构),您将替换1:by:-1.如果数据具有与CPU不同的字节序,那么您还需要反转字节的顺序(:: – 1). )

编辑3:为了更快的速度,我想你将不得不走出python.这个fortran函数也使用openMP,与我的版本相比,速度提高了2倍(因此比你的快4倍).

subroutine f(a,b)

implicit none

integer*1, intent(in) :: a(:)

integer*1, intent(out) :: b(size(a)*2/3)

integer :: i

!$omp parallel do

do i = 1, size(a)/3

b(2*(i-1)+1) = a(3*(i-1)+2)

b(2*(i-1)+2) = a(3*(i-1)+3)

end do

!$omp end parallel do

end subroutine

用FOPT =“ – fopenmp”编译f2py -c -m basj {,.f90} -lgomp.然后,您可以在python中导入并使用它:

import basj

def convert(data): return def mine2(data): return basj.f(np.frombuffer(data,'b')).view('i2')

您可以通过环境可变OMP_NUM_THREADS控制要使用的核心数,但默认使用所有可用核心.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值