时间:2010-07-25 17:42:02

标签: python c scipy

4 个答案:

答案 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