我有一个二维数组v,v.shape=(M_1,M_2),我要重塑成一个三维阵列v.shape=(M_2,N_1,N_2),和M_1=N_1*N_2.
我想出了以下几行产生相同的结果:
np.reshape(v.T, reshape_tuple)
Run Code Online (Sandbox Code Playgroud)
和
np.reshape(v.ravel(order='F'), reshape_tuple)
Run Code Online (Sandbox Code Playgroud)
对 reshape_tuple=(M_2,N_1,N_2).
如果原始v是一个巨大的(可能是复数值的)矩阵,哪一个在计算上更好,在什么意义上(comp时间,内存等)?
我的猜测是使用转置更好,但如果reshape是自动ravel然后ravel-option reshape可能更快(虽然可能ravel在C或Fortran中做,然后它不清楚)?
我正在尝试在 cython 中使用 openmp 。我需要在 cython 中做两件事:
#pragma omp single{}i)在我的 cython 代码中使用范围。
ii) 使用#pragma omp barrier{}
有谁知道如何在 cython 中做到这一点?
以下是更多详细信息。我有一个 nogil cdef 函数my_fun(),我在 omp for 循环中调用它:
from cython.parallel cimport prange
cimport openmp
cdef int i
with nogil:
for i in prange(10,schedule='static', num_threads=10):
my_func(i)
Run Code Online (Sandbox Code Playgroud)
在内部my_func,我需要放置一个屏障来等待所有线程赶上,然后仅在其中一个线程中执行一项耗时的操作并获取 gil,然后释放屏障,以便所有线程同时恢复。
cdef int my_func(...) nogil:
...
# put a barrier until all threads catch up, e.g. #pragma omp barrier
with gil:
# execute time consuming operation in one thread only, …Run Code Online (Sandbox Code Playgroud)