答案 0 :(得分:4)
答案 1 :(得分:1)
问题是您在C代码中将240万个数字打印到屏幕上。这当然需要一段时间,因为必须将数字转换为字符串然后打印到屏幕上。你真的需要将它们全部打印到屏幕上吗?你的最终目标是什么?
为了进行比较,我尝试将另一个数组设置为a中的每个元素。这个过程在编织过程中花了大约0.05秒。 30秒左右,我放弃了将所有元素打印到屏幕上的计时。
答案 2 :(得分:0)
没有办法加快访问C中的多维数组。你必须计算数组索引,你必须取消引用它,这很简单。
答案 3 :(得分:0)
我真的希望,你没有像所有的印刷语句一样运行循环,就像Justin已经注意到的那样。除此之外:
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
这似乎很合理。如果你想进一步加快速度,你可能想要开始使用你的GPU,这非常适合那样的数字运算。
在这种特殊情况下,您甚至可以这样做:
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