我正在处理 64 位无符号整数,并在对其余位值进行解码之前比较值进行位移位比较。
我正在迭代数百万个值并试图最小化处理时间。
问题是 uint64 和 numpy-uint64 都不支持位移位。我试图避免使用 int64 来避免负值。
示例数据:
0x8204000000000080
移位后(字>> 60):=-8 #但与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)
输出:
2.055999994277954
3.1540000438690186
0.619999885559082
0.5810000896453857
最佳答案
问题是,当您将移位应用于数组标量时,NumPy 会尝试生成一个输出类型,该类型可以保存两个输入 dtype 的所有值(将 Python int 转换为 int32 或 int64)。没有整数 dtype 可以同时保存 uint64 和有符号 dtype 的所有值,并且浮点数不是这里的选项。
当一个操作数是数组而另一个是标量(这里是 Python int)时, NumPy attempts to stuff the scalar into a smaller dtype ,对于大多数移位操作意味着移位量被转换为 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
关于使用numpy进行python位移,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30513741/