使用numpy进行位运算

3
假设我有两个使用numpy数组表示的位棋盘
import numpy

bitboard = numpy.zeros(2, dtype=numpy.int64)

假设我想设置第一个位板的第10位。最快的方法是什么?


我能想到两种方法。这是第一种方法:

numpy.bitwise_or(a[0], numpy.left_shift(1, 10), out=a, where=(True, False))

这是第二种方法:

a[0] |= 1 << 10

哪个更快?还有其他的方法吗?特别是我想知道:

  1. 当我访问a [0]时,numpy返回int64还是Python的long
  2. 如果它返回Python的long,那么我假设这两种方法都相当慢,因为它们处理任意精度的数字。 我在假设这一点上正确吗?
  3. 如果是这样,那么有没有办法使位运算作用于固定精度的数字?

请注意,我正在使用Python版本3。


1
你不能自己做一些基准测试来比较吗?另外,你可以执行a[0]并检查返回类型...这些都是经验性的问题,看起来是这样。 - juanpa.arrivillaga
不会使其成为离题。经验性问题符合StackOverflow的准则。 - Aadit M Shah
此外,这也是一个对其他有着同样问题的人而言很好的资源。 - Aadit M Shah
1个回答

2
哪种方法更快?还有其他方法吗?
第二种方法更快。
当我访问a [0]时,numpy会返回int64还是Python long?
它将返回int64。
如果它返回Python long,那么我假设两种方法都很慢,因为它们适用于任意精度数字。我在这方面的假设正确吗?
有关更多详细信息,请参见此线程:Slow bitwise operations

感谢您整理我的答案 :) - ShreyasG
3
"第二种方法更快。" <-- 有证据吗?同时,我没有在您提供的链接中看到对原问题的答案。 - charlesreid1
使用timeit,第一种方法的_CPU时间: 用户34微秒,系统: 0纳秒,总计: 34微秒_,第二种方法的_CPU时间: 用户8微秒,系统: 1微秒,总计: 9微秒。这个问题是开放式的,我已经尝试回答了其中的一些。 - ShreyasG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接