Ob's schnell genug ist oder nicht, kann nur ein Benchmark im konkreten Anwendungsfall sagen, niemals eine allgemeine Beschreibung. Bevor ich mir eine Extrabibliothek als Abhängigkeit an's Bein binde, würde ich's erst mal mit Bordmitteln versuchen.
Hier ist ein Beispiel:
Code: Alles auswählen
class Field:
def __init__(self, width, height):
self.width, self.height = width, height
self.values = [[None] * width for x in range(height)]
def __getitem__(self, x, y):
self._check(x, y)
return self.values[x + self.width * y]
def neighbors(self, x, y):
self._check(x, y)
for yy in range(max(0, y - 1), min(self.height, y + 2)):
for xx in range(max(0, x - 1), min(self.width, x + 2)):
yield self[x, y]
def _check(self, x, y):
if x < 0 or x >= self.width: raise IndexError("x")
if y < 0 or y >= self.height: raise IndexError("y")
Dann geht:
Code: Alles auswählen
field = Field(10, 10)
for f in field.neighbors(3, 4):
print f
Direkte Referenzen auf die 8 Nachbarfelder würde ich nicht speichern, da es die Initialisierung so aufwendig macht. Wenn man jedoch nicht extra immer über das 2D-Array gehen möchte, sondern wenn es für den Anwendungsfall besser scheint, eine verkettete Topologie aus Einzelzellen aufzubauen, dann kann das eine Lösung sein.
Stefan