我正在寻找我的功能的快速替代品.目标是根据任何长度整数制作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