了解Numpy内部结构以进行性能分析

Pav*_*vel 4 profiling numpy

分析一段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解释器开销.