2017-10-11 3 views
1

Angenommen, ich habe zwei bitboards stellte eine numpy Array:bitweise Operationen mit numpy

import numpy 

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

Lasst uns sagen, dass ich das 10. Bit des ersten Bitboard festlegen möchten. Was ist der schnellste Weg, dies zu tun?


Es gibt zwei Möglichkeiten, die ich mir vorstellen kann. Hier ist der erste Weg:

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

Hier ist der zweite Weg:

a[0] |= 1 << 10 

Welches ist schneller? Gibt es einen anderen Weg, dies zu tun? Insbesondere würde ich gerne wissen:

  1. Wenn ich a[0] zugreift long ein int64 oder eine Python numpy zurückkehren?
  2. Wenn es ein Python long zurückgibt, dann nehme ich an, dass beide Methoden ziemlich langsam sind, weil sie an Zahlen mit beliebiger Genauigkeit arbeiten. Habe ich recht damit?
  3. Wenn ja, gibt es eine Möglichkeit, bitweise Operationen mit Zahlen mit fester Genauigkeit zu arbeiten?

Bitte beachte, dass ich Version Python 3.

+1

Können Sie nicht Ihr eigenes Benchmarks tun, um sie zu vergleichen? Man kann auch 'a [0]' machen und den Rückgabetyp überprüfen ... das sind empirische Fragen, so scheint es. –

+0

macht es nicht zum Thema. Empirische Fragen sind in den StackOverflow-Richtlinien enthalten. –

+0

Darüber hinaus ist es eine gute Ressource für andere Leute, die die gleichen Fragen haben, die ich mache. –

Antwort

1

Welches ist schneller? Gibt es einen anderen Weg, dies zu tun?

Die zweite Methode ist schneller.

Wenn ich a[0] Zugriff hat numpy long eine int64 oder eine Python zurückgeben?

Es wird eine int64 zurückgegeben.

Wenn es ein Python long zurückgibt, dann nehme ich an, dass beide Methoden ziemlich langsam sind, weil sie an Zahlen mit beliebiger Genauigkeit arbeiten. Habe ich recht damit?

Weitere Details zu diesem Thema: Slow bitwise operations

+0

Danke für die Reinigung meiner Antwort :) – ShreyasG

+1

"Die zweite Methode ist schneller." <- Beweis? Außerdem wird in dem von Ihnen angegebenen Link keine Antwort auf die ursprüngliche Frage angezeigt. – charlesreid1

+0

Verwendung von timeit, _CPU Zeiten: Benutzer 34 μs, sys: 0 ns, insgesamt: 34 μs_ für die erste und _CPU Zeiten: Benutzer 8 μs, sys: 1 μs, insgesamt: 9 μs_ für die zweite Methode. Die Frage war offen und ich habe versucht, einige davon zu beantworten. – ShreyasG