【问题标题】:Any way to speed up Python long int bitwise operation?有什么方法可以加快 Python long int 按位运算?
【发布时间】:2014-12-21 21:25:49
【问题描述】:

我正在用 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。

非常感谢。

【问题讨论】:

  • 你看过 cython、numpy f2py 等吗?
  • @PadraicCunningham 我只能编写非常基本的 C/Fortran,所以想先看看是否可以不自己编写它们。
  • 您不必编写 c 来使用 cython,这就是它为您完成所有工作的关键。
  • 使用 PyPy。或者,如果可能,使用 Numpy。
  • @TonySuffolk66 正如问题中的 OP 所述,以这种方式实现的是 模块,而不是 OP 的代码。作为python-chess的作者。

标签: python bit-manipulation


【解决方案1】:

我维护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 long 相同,因此它应该是直接替换。 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 类型的所有性能优势,您可能需要修改逻辑和/或代码。

【讨论】:

  • 有趣的是,python-chess 的作者在文档中就是这么说的。
【解决方案2】:

尝试使用这个包:https://pypi.python.org/pypi/bitarray

它是 C 代码的 Python 接口,旨在加速按位运算。

【讨论】:

  • 在 CPython 上的速度要慢 5 倍。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-03
  • 1970-01-01
  • 2019-09-22
  • 1970-01-01
相关资源
最近更新 更多