以下代码
@jit(uint32(uint32))
def foo(x):
return (x >> 6)
print(hex(foo(0xffffffff)))
输出
0xffffffff
因为numba
使用算术右移,尽管操作数被定义为无符号。
有什么方法可以用逻辑移位来传达它吗?
事实上,从JoshAdel下面的回答中,我学到了一个变通方法——使用一个内部64位变量,逻辑和算术移位不会有什么不同。像这样:
@jit(uint32(uint32), locals = {'t': uint64})
def foo1(x):
t = x
return t << 8
@jit(uint32(uint32), locals = {'t': uint64})
def foo2(x):
t = x
return t >> 8
print(hex(foo1(0xffffffff)))
print(hex(foo2(0xffffffff)))
它打印
0xffffff00
0xffffff
但一个优秀的编译器应该明白,应用于unsigned
数字的>>
会导致逻辑移位。
我从使用numba 0.27:的纯python和numba jited版本中得到了相同的答案
import numba as nb
def foo(x):
return (x >> 6)
foo_nb = nb.jit()(foo)
print(hex(foo(0xffffffff)))
print(hex(foo_nb(0xffffffff)))
结果在:
0x3ffffff
0x3ffffff
以下也产生了相同的结果(以确保我们不会回到对象模式并实际使用完整的jit):
foo_nb2 = nb.jit('uint(uint)', nopython=True)(foo)
print(hex(foo_nb2(0xffffffff)))
# prints 0x3ffffff
你使用的是哪个版本的Numba?