我已经litterally花费周(在用Cython仍然虽然)改变我用Cython代码以纯C获得速度并成为能够删除GIL以执行多线程以获得更高的速度。用Cython numpy的ndarray(N,4,2)转换为矢量[向量[对[双,双]]
与其他计算器的用户的帮助下,我终于通过使用4个线程(与PRANGE)的双重成功,并获得了10倍纯C VS用Cython一些蟒蛇,然后再一个因素3的循环部分我码。
BUT为了进入该循环我首先必须两个维度(N,4,2)的3维numpy ndarrays
(和(K,4,2))转换为vector[vector[pair[double,double]]]
。 K和N相当大。
对于这个我做的:
cdef int N=200000 #Of this order of magnitude
cdef np.ndarray[DTYPE_t,ndim=3] numpy_array=np.random.uniform(size=(N,4,2))
t1=time.time()
cdef vector[vector[pair[double,double]]] c_structure
c_structure.reserve(N)
cdef int i
for i in range(N):
c_structure.push_back(numpy_array[i])
t2=time.time()
然而,这部分代码,我认为琐碎已经成为我的代码的新的瓶颈! for循环的双重需要我的电脑0.1S(而不是在原来的实现1.11s)单个线程上,这部分需要3整秒(1.5s的每个阵列)!这使得我的超级优化代码比我原来的代码慢了3倍(1.5 * 2 + 0.1)!
我在做什么错?!如何加速这个?!
见another related question that I asked
在这方面并不重要,但'np.random.uniform((N,4,2))'不返回3D阵列...请尽量让[mcve]至少相对正确。 – MSeifert
感谢它现在纠正了 – jean
大部分时间是否有可能产生随机数? –