分析一段numpy代码表明我大部分时间都在这两个函数中
numpy/matrixlib/defmatrix.py.__getitem__:301
numpy/matrixlib/defmatrix.py.__array_finalize__:279
Run Code Online (Sandbox Code Playgroud)
这是Numpy来源:
问题#1:
__getitem__似乎每当我使用类似的东西时都会调用my_array[arg]它,如果arg不是整数而是切片,它会变得越来越贵.有没有办法加快对数组切片的调用?
例如
for i in range(idx): res[i] = my_array[i:i+10].mean()
Run Code Online (Sandbox Code Playgroud)
问题2:
什么时候__array_finalize__被调用,如何通过减少对此函数的调用次数来加快速度?
谢谢!
Tra*_*ant 11
你不能使用矩阵,只需使用2d numpy数组.我通常只使用矩阵短时间来利用乘法的语法(但是在数组上添加了.dot方法,我发现我做的越来越少).
但是,对你的问题:
1)__getitem__除非defmatrix过度骑行__getslice__,否则它确实没有捷径,但它还没有.有.item和.itemset方法针对整数获取和设置进行了优化(并返回Python对象而不是NumPy的数组标量)
2)__array_finalize__在创建数组对象(或子类)时调用.它是从C函数调用的,每个数组创建都可以通过它进行管道传输. https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/ctors.c#L1003
在纯粹用Python定义的子类的情况下,它从C调用回来的Python解释器,它有开销.如果矩阵类是内置类型(例如,基于Cython的cdef类),则调用可以避免Python解释器开销.