看来你在这里非常迂回.这不会做同样的事情吗?
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控制要使用的核心数,但默认使用所有可用核心.