python int32 binary_python – 功能速度提升:将int转换为32位整数列表

该博客讨论了如何提高将整数转换为32位整数列表的Python函数的性能。作者分享了两种实现方式,并寻求进一步的优化建议,目标是每秒处理超过4M个元组。目前的最快实现涉及位操作和循环,但作者希望将其速度提升10倍。
摘要由CSDN通过智能技术生成

我正在寻找我的功能的快速替代品.目标是根据任何长度整数制作32位整数列表.长度在(value,bitlength)元组中明确给出.这是异步接口的bit-banging过程的一部分,每个总线事务需要4个32位整数.

所有整数都是无符号,正数或零,长度可以在0到2000之间变化

我的输入是这些元组的列表,

输出应该是具有隐式32位长度的整数,其中的位按顺序排列.还应返回不适合32的其余位.

input: [(0,128),(1,12),(0,32)]

output:[0, 0, 0, 0, 0x100000], 0, 12

我花了一两天的时间用cProfile进行分析,并尝试了不同的方法,但我似乎有点坚持使用一秒钟内需要~10万元组的函数,这有点慢.理想情况下,我希望加速10倍,但我没有足够的经验知道从哪里开始.速度的最终目标是速度超过每秒4M元组.

感谢您的任何帮助或建议.

我能做的最快的是:

def foo(tuples):

'''make a list of tuples of (int, length) into a list of 32 bit integers [1,2,3]'''

length = 0

remlen = 0

remint = 0

i32list = []

for a, b in tuples:

n = (remint << (32-remlen)) | a #n = (a << (remlen)) | remint

length += b

if length > 32:

len32 = int(length/32)

for i in range(len32):

i32list.append((n >> i*32) & 0xFFFFFFFF)

remint = n >> (len32*32)

remlen = length - len32*32

length = remlen

elif length == 32:

appint = n & 0xFFFFFFFF

remint = 0

remlen = 0

length -= 32

i32list.append(appint)

else:

remint = n

remlen = length

return i32list, remint, remlen

这有非常相似的表现:

def tpli_2_32ili(tuples):

'''make a list of tuples of (int, length) into a list of 32 bit integers [1,2,3]'''

# binarylist = "".join([np.binary_repr(a, b) for a, b in inp]) # bin(a)[2:].rjust(b, '0')

binarylist = "".join([bin(a)[2:].rjust(b, '0') for a, b in tuples])

totallength = len(binarylist)

tot32 = int(totallength/32)

i32list = [int(binarylist[i:i+32],2) for i in range(0, tot32*32, 32) ]

remlen = totallength - tot32*32

remint = int(binarylist[-remlen:],2)

return i32list, remint, remlen

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值