2017-10-11 34 views
1

假設位運算,我有兩個bitboards使用numpy的數組表示:與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]'並檢查返回類型......看起來這些是經驗問題。 –

+0

不會讓它脫離主題。經驗問題在StackOverflow指南中。 –

+0

此外,對於和我有同樣問題的其他人來說,這是一個很好的資源。 –

回答

1

哪一個是更快?有沒有其他方法可以做到這一點?

第二種方法更快。

當我訪問a[0]確實numpy的返回int64或一個Python long

它會返回一個int64

如果它返回一個Python long那麼我假設這兩個方法都很慢,因爲它們工作在任意精度數字上。我是否正確地假設?

更多細節在這個線程:Slow bitwise operations

+0

謝謝你清理我的答案:) – ShreyasG

+1

「第二種方法更快。」 < - 證明?另外,在您提供的鏈接中沒有看到原始問題的答案。 – charlesreid1

+0

使用timeit,_CPU次數:用戶34μs,sys:0 ns,總共:第一個和_CPU時間爲34μs_:用戶8μs,系統:1μs,總計:第二種方法爲9μs_。問題是開放式的,我試圖回答其中的一些問題。 – ShreyasG