Я действительно надеюсь, что вы не запустили цикл со всеми операторами печати, как уже отмечал Джастин.Кроме того:
from scipy import weave
n1, n2, n3 = 200, 300, 400
def m1():
a = np.zeros((n1,n2,n3), int)
for i in xrange(n1):
for j in xrange(n2):
for k in xrange(n3):
a[i,j,k] = i*300*400 + j*400 + k
return a
def m2():
grid = np.ogrid[0:n1,0:n2,0:n3]
b = grid[0]*300*400 + grid[1]*400 + grid[2]
return b
def m3():
a = np.zeros((n1,n2,n3), int)
code = """
int rows = Na[0];
int cols = Na[1];
int depth = Na[2];
int val = 0;
for (int i=0; i<rows; i++) {
for (int j=0; j<cols; j++) {
for (int k=0; k<depth; k++) {
val = (i*cols + j)*depth + k;
a[val] = val;
}
}
}"""
weave.inline(code, ['a'])
return a
%timeit m1()
%timeit m2()
%timeit m3()
np.all(m1() == m2())
np.all(m2() == m3())
Дает мне:
1 loops, best of 3: 19.6 s per loop
1 loops, best of 3: 248 ms per loop
10 loops, best of 3: 144 ms per loop
Что кажется довольно разумным.Если вы хотите еще больше ускорить его, вы, вероятно, захотите начать использовать свой графический процессор, который идеально подходит для подобных операций.
В этом особом случае вы можете даже:
def m4():
a = np.zeros((n1,n2,n3), int)
code = """
int rows = Na[0];
int cols = Na[1];
int depth = Na[2];
for (int i=0; i<rows*cols*depth; i++) {
a[i] = i;
}"""
weave.inline(code, ['a'])
return a
Но это уже не намного лучше, поскольку np.zeros()
уже занимает большую часть времени:
%timeit np.zeros((n1,n2,n3), int)
10 loops, best of 3: 113 ms per loop