如何加快python嵌套循环的速度?

如何加快python嵌套循环的速度?,python,Python,我试图通过计算物体两侧的重力效应来计算被掩埋物体的重力效应,然后总结贡献,在一个测站得到一个测量值,在多个测站重复测量。代码如下(主体是一个正方形,代码顺时针计算,这就是为什么它从-x回到-x坐标) 加速循环的任何帮助都将得到感谢。 < P>你的XCurnand Zurn值重复,所以考虑缓存一些计算的结果。 查看timeit和profile模块,以获取更多有关计算时间最长的信息。在Python循环中访问numpy数组的各个元素效率非常低。例如,此Python循环: for i in xrange

我试图通过计算物体两侧的重力效应来计算被掩埋物体的重力效应,然后总结贡献,在一个测站得到一个测量值,在多个测站重复测量。代码如下(主体是一个正方形,代码顺时针计算,这就是为什么它从-x回到-x坐标)


加速循环的任何帮助都将得到感谢。

< P>你的XCurnand Zurn值重复,所以考虑缓存一些计算的结果。


查看timeit和profile模块,以获取更多有关计算时间最长的信息。

在Python循环中访问numpy数组的各个元素效率非常低。例如,此Python循环:

for i in xrange(0, len(a), 2):
    a[i] = i
将比以下速度慢得多:

a[::2] = np.arange(0, len(a), 2)
您可以使用更好的算法(时间复杂度更低)或对
numpy
数组使用向量运算,如上面的示例所示。但更快的方法可能只是使用以下方法编译代码:

不必定义所有类型,但如果与Python相比需要显著提高速度,则应至少定义数组和循环索引的类型

您可以使用(Cython支持它),而不是手动调用
time.clock()

要调用
过程()


为此类问题建议一个更好的论坛。@aix:
si.arange()
可能建议他已经使用了
numpy
数组。@J.F.Sebastian:很好。我已经删除了我的评论,以免引起任何进一步的混乱。谢谢你的帮助,我会看看cython是否有用,我不担心时间。clock()因为我把它放在那里只是为了看看每次迭代的速度有多快,而我试着加快它,这不是代码的必要部分。
a[::2] = np.arange(0, len(a), 2)
#cython: boundscheck=False, wraparound=False
#procedure_module.pyx
import numpy as np
cimport numpy as np

ctypedef np.float64_t dtype_t

def procedure(np.ndarray[dtype_t,ndim=1] x, 
              np.ndarray[dtype_t,ndim=1] xcorn):
    cdef:
        Py_ssize_t i, j
        dtype_t x1, x2, z1, z2, r1, r2, O1, O2 
        np.ndarray[dtype_t,ndim=1] grav = np.empty_like(x)
    for i in range(x.shape[0]):
        for j in range(xcorn.shape[0]-1):
            x1 = xcorn[j]-x[i]
            x2 = xcorn[j+1]-x[i]
            ...
        grav[i] = ...
    return grav
#!/usr/bin/env python
import pyximport; pyximport.install() # pip install cython
import numpy as np

from procedure_module import procedure

x = np.arange(-30.0,30.0,0.5)
xcorn = np.array((-9.79742526,9.78716693 ,9.78716693 ,-9.79742526,-9.79742526))
grav = procedure(x, xcorn)