У меня есть две очень простые функции 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 мкс ta_pa
: 28,1 мкс
Пока все в порядке!но когда я заменяю ta_li
на ta_pa
в большем скрипте (который запускается - среди прочего - эта функция несколько тысяч раз), его выполнение становится намного медленнее, чем при использовании с ta_li
!
- При выполнении моего сценария с
ta_li
, 1 процессор в действии - При выполнении моего сценария с
ta_pa
, 4 процессора в действии - Я использовал 256x256 массивов во всех тестах
Я уверен, что есть подходящее объяснение этому поведению, но я его не понимаю.Есть гипотеза?