cython中并行函数的运行时间

2024-09-28 21:27:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个非常简单的cython函数,如下所示(用-fopenmp编译):

#cython: language_level=3
#cython: wraparound=False
#cython: boundscheck=False
#cython: nonecheck=False
#cython: cdivision=True

import numpy as np
cimport numpy as np
cimport cython
from cython.parallel cimport prange, parallel


def ta_pa(double[:,::1] out, double[:,::1] u, double[:,::1] K, double a):


    cdef Py_ssize_t ix, iz
    cdef Py_ssize_t nx = out.shape[0]
    cdef Py_ssize_t nz = out.shape[1]

    with nogil, parallel():
        for ix in prange(nx):
            for iz in range(nz):
                out[ix, iz] = u[ix, iz] - a*K[ix, iz]

def ta_li(double[:,::1] out, double[:,::1] u, double[:,::1] K, double a):


    cdef Py_ssize_t ix, iz
    cdef Py_ssize_t nx = out.shape[0]
    cdef Py_ssize_t nz = out.shape[1]


    for ix in range(nx):
        for iz in range(nz):
            out[ix, iz] = u[ix, iz] - a*K[ix, iz]

使用timeit在笔记本中测试这两个函数时,使用256x256数组得到以下结果:

  • ta_li:43.3µs码
  • ta_pa:28.1µs码

在这里之前,一切都好!但是当我在一个更大的脚本中用ta_pa替换ta_li时(这个函数在其他脚本中运行了几千次),它的执行速度会比与ta_li一起使用时慢得多

  • 使用ta_li执行脚本时,1个cpu正在运行
  • ta_pa执行脚本时,有4个cpu在运行
  • 我在所有测试中都使用了256x256阵列

我确信对这种行为有恰当的解释,但我不明白。有什么假设吗


Tags: pyforlioutcythonixdoublenx