繁体   English   中英

加速Cython中的数值积分

[英]Speed up numerical integration in Cython

作为物理计算的一部分,我从csv文件中加载了一系列电场值,并将其传递给Cython函数进行积分。 这不是文件中值的简单求和,而是需要在集成的每个步骤中重新计算某个参数。 通过重新组织代码,并将最慢的部分移至Cython,我的速度有了显着提高,但是我怀疑还可以进行进一步的优化。

这是我要加速的Cython函数:

import numpy as np
cimport numpy as np
DTYPE = np.float
ctypedef np.float_t DTYPE_t
cdef float m = 938272046
cdef float c = 299792458
cimport cython

@cython.boundscheck(False)
def ELTintegration(float xelmax, float deltaT, float phi, float omega, 
                np.ndarray[DTYPE_t] zExtract, np.ndarray[DTYPE_t] EzExtract, float KEin):
    cdef float integ = 0 
    cdef float xelmax_deltaT = xelmax * deltaT
    cdef unsigned int i, loopLen=len(EzExtract)
    cdef float v
    cdef float z, Ez, phaseTerm, diff
    cdef float newE, gamma, beta
    for i in range(len(EzExtract)):
        z = zExtract[i]
        Ez = EzExtract[i]
        newE = KEin + integ
        gamma = newE/m + 1 
        beta = (1 - 1/gamma**2)**0.5
        v = beta * c 
        phaseTerm = np.cos(omega*z/v + phi)
        diff = phaseTerm * Ez * xelmax_deltaT
        integ = integ + diff

    return integ

每个ndarray是一维的,并包含约4000个浮点数。

如您所见,我已经声明了我使用的所有变量,关闭了边界检查,提高了数组索引的效率,并将所有必要的计算从循环中拉出。

我是否已达到我可以合理地加快速度的极限? 在实现更高效的功能方面我有什么想念的吗? 认为我可以将速度提高2倍是否现实?

谢谢阅读。

蒂姆·皮茨克(Tim Pietzcker)是对的,因为它更适合于代码审查,但在这里也几乎是话题,所以我继续。

如果你跑

cython -a myfile.pyx

您会看到黄色。 通常(但并非总是),黄色表示缓慢。 最重要的黄色是np.cos调用。 这将非常慢,因为您要使用Python并进行大量类型创建来完成它。

使用

from libc.math cimport cos

将允许您使用C的cos ,这将更快。

对于零除和除号也有一些检查。 通过将编译器指令 cdivisionTrue可以避免这些情况。

注意,使用numpy的阵列的现代方法是用memoryview语法(例如DTYPE_t[:]类型的一维memoryview DTYPE_t )。

另请注意,在纯Python代码上使用numbaautojit可能会变得更好,甚至更好。 numba做疯狂的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM