我使用的是64位无符号整数,经过位移位后,在解码其余位值之前比较值。我正在迭代数百万个值,并试图最小化处理时间。
问题是uint 64和numpy-uint 64都不支持位移位。我试图避免使用int 64来避免负值。
示例数据:0x 820400000000080移位后(字>> 60):=-8 #但与0x 8比较
循环100万次并观察花费多长时间,发现在所有方法中,‘>>’移位运算符是最方便的,具有调用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
2条答案
按热度按时间hfwmuf9z1#
问题是,当你将移位应用于数组标量时,NumPy试图生成一个可以保存两个输入数据类型的所有值的输出类型(使用Python int转换为int32或int64)。没有一个整型的dtype可以同时包含uint64和有符号的dtype的所有值,浮点数在这里也不是一个选项。
当一个操作数是数组,另一个是标量(这里是Python int)时,NumPy试图将标量填充到更小的dtype中,对于大多数移位操作来说,这意味着移位量被转换为int8或uint8,这取决于另一个操作数是否有符号。uint64和uint8都适合于uint64。
你必须将移位量转换为一个unsigned int:
68bkxrlz2#
也许我不明白这个问题?