На входе у меня есть подписанный массив байтов barr
(обычно с прямым порядком байтов, но это, вероятно, не имеет значения) и число с плавающей запятой f
для умножения barr
.
Мой подход состоит в том, чтобы преобразовать barr
в целое число val
(используя функцию int.from_bytes
), умножить его, выполнить проверки переполнения и "обрезать" умноженное на val
при необходимости, а затем преобразовать его обратно в массив байтов.
def multiply(barr, f):
val = int.from_bytes(barr, byteorder='little', signed=True)
val *= f
val = int (val)
val = cropInt(val, bitLen = barr.__len__()*8)
barr = val.to_bytes(barr.__len__(), byteorder='little', signed=True)
return barr
def cropInt(integer, bitLen, signed = True):
maxValue = (2**(bitLen-1)-1) if signed else (2**(bitLen)-1)
minValue = -maxValue-1 if signed else 0
if integer > maxValue:
integer = maxValue
if integer < minValue:
integer = minValue
return integer
Однако этот процесс чрезвычайно медленный при обработке большого объема данных. Есть ли лучший, более эффективный способ сделать это?
maxValue
иminValue
из функцииcropInt
, чтобы увеличить ее скорость. - person Stanislav Ivanov   schedule 08.11.2016timeit
сессии большая часть времени уходит наint.from_bytes()
иint.to_bytes()
, которые будет сложно сделать быстрее - person Guillaume   schedule 08.11.2016