我正在使用 64 位无符号整数,并在位移后比较该值,然后再解码其余位值。
我正在迭代数百万个值并尝试最大程度地减少处理时间。
问题是 uint64 和 numpy-uint64 都不支持位移位。我试图避免使用 int64 以避免负值。
示例数据:
0x8204000000000080
移位后(word>> 60): =-8 #but 与 0x8 比较
循环一百万次并查看需要多长时间,发现在所有方法中,“>>”移位运算符是最方便的,是调用 abs() 函数的下一个最佳选项。对此有没有更好更方便的解决方案呢?
循环代码:
import numpy as np
import time
start_time= time.time()
for i in range(1000000):
x= np.int64(-1)
x=np.right_shift(x,60)
print (time.time()-start_time)
start_time= time.time()
for i in range(1000000):
x= np.uint64(-1)
x=int(x/(2**60))
print (time.time()-start_time)
start_time= time.time()
for i in range(1000000):
x= np.int64(-1)
x=abs(x>>60)
print (time.time()-start_time)
start_time= time.time()
for i in range(1000000):
x= np.int64(-1)
x= x>>60
print (time.time()-start_time)
Output:
2.055999994277954
3.1540000438690186
0.619999885559082
0.5810000896453857
问题是,当您将移位应用于数组标量时,NumPy 尝试生成一个可以保存两种输入数据类型的所有值的输出类型(使用 Python int 转换为 int32 或 int64)。没有任何整数数据类型可以同时保存 uint64 和有符号数据类型的所有值,并且浮点数在这里也不是一个选项。
当一个操作数是数组而另一个是标量(这里是 Python int)时,NumPy 尝试将标量填充到更小的数据类型中 https://stackoverflow.com/questions/45949263/numpy-casting-float32-to-float64/45949567#45949567,对于大多数移位操作来说,这意味着移位量被转换为 int8 或 uint8,具体取决于另一个操作数是否有符号。 uint64 和 uint8 都适合 uint64。
您必须将移位量转换为无符号整数:
>>> numpy.uint64(-1) >> 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: ufunc 'right_shift' not supported for the input types, and the inputs
could not be safely coerced to any supported types according to the casting rul
e ''safe''
>>> numpy.uint64(-1) >> numpy.uint64(1)
9223372036854775807
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)