Puede comprimirlos. es decir:
for a_row,b_row in zip(alist, blist):
for a_item, b_item in zip(a_row,b_row):
if a_item.isWhatever:
b_item.doSomething()
Sin embargo la sobrecarga de compresión y iterar sobre los elementos puede ser mayor que su método original si rara vez utiliza realmente el b_item (es decir a_item.isWhatever suele ser falso). Podría usar itertools.izip en lugar de zip para reducir el impacto de la memoria de esto, pero aún así probablemente será un poco más lento a menos que siempre necesite el b_item.
Alternativamente, considere usar una lista 3D en su lugar, para que el terreno para la celda i, j esté en l [i] [j] [0], objetos en l [i] [j] [1] etc., o incluso combinar los objetos para que pueda hacer un [i] [j] .terrain, un [i] [j] .objeto, etc.
[Editar] DzinX's timings en realidad muestran que el impacto del cheque adicional para b_item no es realmente significativo, junto a la penalización de rendimiento al volver a buscar por índice, por lo que lo anterior (usando izip) parece ser el más rápido.
También he dado una prueba rápida para el enfoque 3D, y parece más rápido aún, así que si puede almacenar sus datos en esa forma, podría ser más simple y más rápido de acceder. He aquí un ejemplo de su uso:
# Initialise 3d list:
alist = [ [[A(a_args), B(b_args)] for i in xrange(WIDTH)] for j in xrange(HEIGHT)]
# Process it:
for row in xlist:
for a,b in row:
if a.isWhatever():
b.doSomething()
Aquí están mis tiempos de 10 bucles utilizando una matriz de 1000x1000, con diferentes proporciones de isWhatever ser fiel son:
(Chance isWhatever is True)
Method 100% 50% 10% 1%
3d 3.422 2.151 1.067 0.824
izip 3.647 2.383 1.282 0.985
original 5.422 3.426 1.891 1.534
Esto no es lo mismo, en el segundo para el rango tomó el len de alist [i], ¿por qué eliminaste ese índice? –
Definitivamente me gusta este. Puede que no sea la mejor respuesta, pero es bastante probable que lo use. –
Esto es solo azúcar de sintaxis sobre lo que escribió Eugene. Me temo que este generador podría ser muy lento si las redes son lo suficientemente grandes. Después de todo, cada rendimiento aún requiere cuatro búsquedas de índice. – DzinX