我正在尝试加速Python脚本。我已经在纯Python中分析了代码并重新考虑了很多因素。似乎我仍然花费大量时间以一种看起来像这样的方式访问一些numpy数组:
KeyArray[BoolArray[index]]
其中KeyArray
是ndim = 2且包含字符串,BoolArray
是ndim = 1且包含bool
且索引是int
。
我正在尝试学习Cython以了解它的速度有多快。我编写了以下不起作用的脚本:
import numpy as np
cimport numpy as np
def fastindexer(np.ndarray[np.str_t,ndim=1] KeyArray, np.ndarray [np.bool_t,ndim=2] BoolArray, np.int_t DateIndex):
cdef np.ndarray[np.str_t,ndim=1] FArray = KeyArray[BoolArray[DateIndex]]
return FArray
据我所知,str / bool类型在np数组中不可用。我试图施放,但我不明白应该如何编写。
欢迎所有帮助
答案 0 :(得分:1)
正如@Joe所说,将单个索引语句移动到Cython将不会给你速度。如果您决定将更多程序移至Cython,则需要解决许多问题。
1)您使用def
代替cdef
,限制您使用仅限Python的功能
2)您使用旧的缓冲区语法。阅读memoryviews
3)切片二维数组很慢,因为每次都会创建一个新的内存视图。也就是说,它仍然比Python快得多,但是为了达到最佳性能,你必须使用不同的方法。
这是让你开始的东西。
cpdef func():
cdef int i
cdef bool[:] my_bool_array = np.zeros(10, dtype=bool)
# I'm not if this next line is correct
cdef char[:,:] my_string_array = np.chararray((10, 10))
cdef char answer
for i in range(10):
answer = my_string_array[ my_bool_array[i] ]