我正在用Python编写国际象棋程序,我使用python-chess进行电路板表示和移动生成等。它通常非常好,并且具有非常有用的功能。
然而,由于它是纯Python,它现在是我的AI的瓶颈。 Python长整数及其按位运算广泛用于模块中,例如
x = b & -b
b ^= x
if not x & 0xffffffff:
x >>= 32
r |= 32
有没有办法在Python中加速这种操作,可能还有其他一些模块?没有在C或Fortran中重写是否可能?我尝试了numba包,但它似乎无法编译python long int。
非常感谢。
答案 0 :(得分:2)
我维护gmpy2库并且它支持通常比Python的本机整数更快的整数操作。
这是一个简单的例子:
In [3]: x=12345678901234567890
In [4]: %timeit y=x;y>>=32
10000000 loops, best of 3: 113 ns per loop
In [5]: x=gmpy2.mpz(x)
In [6]: %timeit y=x;y>>=32
10000000 loops, best of 3: 71.9 ns per loop
mpz
类型与Python的行为几乎完全相同,因此它应该是直接替代。 gmpy2
还支持名为xmpz
的可变整数类型。它支持直接位操作,对于就地操作可能更快。
In [9]: x=gmpy2.xmpz(0)
In [10]: bin(x)
Out[10]: '0b0'
In [11]: x[4]=1
In [12]: bin(x)
Out[12]: '0b10000'
要使用xmpz
类型的所有性能优势,您可能需要修改逻辑和/或代码。
答案 1 :(得分:1)
尝试使用此软件包:https://pypi.python.org/pypi/bitarray
它是C代码的Python接口,旨在加速逐位操作。