以下代码
@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
会导致逻辑转换。
答案 0 :(得分:1)
我使用Numba 0.27从纯python和numba jitted版本得到相同的答案:
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?