Skip to main content
 首页 » 编程设计

python 位移位与 numpy

2025年05月04日14lidabo

我正在处理 64 位无符号整数,在对值进行位移比较之后,再对其余位值进行解码。 我正在迭代数百万个值并尝试最大程度地减少处理时间。

问题是 uint64 和 numpy-uint64 都不支持移位。我试图避免使用 int64 以避免出现负值。

示例数据: 0x8204000000000080 移位后(word>> 60): =-8 #but comparing to 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 会尝试生成一个输出类型,该类型可以保存两种输入数据类型的所有值(将 Python int 转换为 int32 或 int64)。没有可以同时保存 uint64 和带符号数据类型的所有值的整数数据类型,并且 float 不是此处的选项。

当一个操作数是数组而另一个是标量(这里是 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