Python 3.x Cython-Python列表的高效选项
我在Cython.pyx代码中有两个函数,它们随时间以随机方式调用:Python 3.x Cython-Python列表的高效选项,python-3.x,list,parallel-processing,cython,gil,Python 3.x,List,Parallel Processing,Cython,Gil,我在Cython.pyx代码中有两个函数,它们随时间以随机方式调用: cdef double dirac(self,Py_ssize_t i)nogil: cdef Py_ssize_t index with gil: if i in self.muId: index = self.muId.index(i) if self.muSpk[index] <= self.ti
cdef double dirac(self,Py_ssize_t i)nogil:
cdef Py_ssize_t index
with gil:
if i in self.muId:
index = self.muId.index(i)
if self.muSpk[index] <= self.time[self.tInt]:
self.muId.pop(index)
self.muSpk.pop(index)
return 1/self.dt
else:
return 0
else:
return 0
cdef双狄拉克(self,Py_-ssize_-ti)nogil:
cdef Py_-ssize_-t索引
与gil合作:
如果我在self.muId中:
索引=self.muId.index(i)
如果self.muSpk[index]没有完整的工作代码和附加信息,很难为您提供帮助。但是,如果列表很大,代码的问题是in
运算符和pop
方法的算法复杂度不好。在纯python中,使用dict可以很容易地解决这个问题,其中键是索引,值是计时(注意,标记应该是唯一的)。这将是len(muId)/2倍的平均速度!此外,我认为优先级队列在这里对您没有帮助。实际上,列表不会太大(可能小于1k),但dict不会有帮助,因为我可以在列表中重复muId。您可以使用或dict来处理重复项,因为元素是按顺序删除的。对于100~1000个元素,您应该可以获得很好的加速。如果没有完整的工作代码和附加信息,您将很难获得帮助。但是,如果列表很大,代码的问题是in
运算符和pop
方法的算法复杂度不好。在纯python中,使用dict可以很容易地解决这个问题,其中键是索引,值是计时(注意,标记应该是唯一的)。这将是len(muId)/2倍的平均速度!此外,我认为优先级队列在这里对您没有帮助。实际上,列表不会太大(可能小于1k),但dict不会有帮助,因为我可以在列表中重复muId。您可以使用或dict来处理重复项,因为元素是按顺序删除的。有了100~1000个元素,你应该可以获得很好的加速。
def addSpike(self,Py_ssize_t muId,double delay):
self.muId.append(muId)
self.muSpk.append(self.time[self.tInt] + delay)
if self.LR < muId:
self.LR = muId