【问题标题】:Bitwise operations with numpynumpy 的按位运算
【发布时间】:2018-03-22 14:47:21
【问题描述】:

假设我有两个使用 numpy 数组表示的 bitboards

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。

【问题讨论】:

  • 你不能自己做基准来比较它们吗?此外,您可以执行a[0] 并检查返回类型...这些似乎是经验性问题。
  • 不会偏离主题。经验问题在 StackOverflow 指南中。
  • 此外,对于与我有相同问题的其他人来说,这是一个很好的资源。

标签: python python-3.x numpy


【解决方案1】:

哪个更快?有没有其他方法可以做到这一点?

第二种方法更快。

当我访问 a[0] 时,numpy 是否返回 int64 或 Python long

它会返回一个int64

如果它返回 Python long,那么我假设这两种方法都很慢,因为它们适用于任意精度的数字。我的假设是对的吗?

更多详情见此帖:Slow bitwise operations

【讨论】:

  • 感谢您整理我的答案 :)
  • "第二种方法更快。"
  • 使用 timeit,CPU 时间:用户 34 微秒,系统:0 ns,总计:34 微秒CPU 时间:用户 8 微秒,系统: 1 µs,总计:第二种方法为 9 µs。这个问题是开放式的,我试图回答其中的一些问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 2021-12-20
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多