Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 非常大的就地numpy阵列操作:numba、pythran还是其他?_Python_Numpy_Memory_Numba_Pythran - Fatal编程技术网

Python 非常大的就地numpy阵列操作:numba、pythran还是其他?

Python 非常大的就地numpy阵列操作:numba、pythran还是其他?,python,numpy,memory,numba,pythran,Python,Numpy,Memory,Numba,Pythran,tI需要在非常大的阵列(数百万个条目)上执行操作,这些阵列的累积大小接近可用内存。 我知道,当使用numpy(如a=a*3+b-c**2)执行简单操作时,会创建几个临时数组,从而占用更多内存 由于我计划在内存占用的限制下工作,恐怕这种简单的方法行不通。所以我想用正确的方法开始我的发展 我知道包喜欢或可以帮助提高操作阵列时的性能,但我不清楚它们是否能够自动处理就地操作,避免临时对象 作为一个简单的示例,我必须在大型阵列上使用一个函数: def find_bin(a,索引): 全局偏移、宽度、nst

tI需要在非常大的阵列(数百万个条目)上执行操作,这些阵列的累积大小接近可用内存。 我知道,当使用numpy(如
a=a*3+b-c**2
)执行简单操作时,会创建几个临时数组,从而占用更多内存

由于我计划在内存占用的限制下工作,恐怕这种简单的方法行不通。所以我想用正确的方法开始我的发展

我知道包喜欢或可以帮助提高操作阵列时的性能,但我不清楚它们是否能够自动处理就地操作,避免临时对象

作为一个简单的示例,我必须在大型阵列上使用一个函数:

def find_bin(a,索引):
全局偏移、宽度、nstep
i=(a偏移)*nstep/宽度
i=np.其中(i=nstep,nstep,i)
索引[:]=i.astype(int)
混合了算术运算和对numpy函数的调用

使用numba或pythran(或其他东西)编写这样的函数有多容易? 每种情况的利弊是什么

谢谢你的提示


ps:我知道numexpr,但我不确定它是否方便或适合于比单个算术表达式更复杂的函数?

使用numexpr。例如:

import numexpr
numexpr.evaluate("a+b*c", out=a)
这可以帮助您避免tmp变量,您可以参考高性能Python,M.G,I.O.

通过设计避免了许多临时数组。对于您所指的简单表达式,应该是


#pythran导出查找箱(float[],int[],float,float,int)
将numpy作为np导入
def查找箱(a、索引、偏移、宽度、nstep):
i=(a偏移)*nstep/宽度#
i=np.其中(i=nstep,nstep,i)
索引[:]=i.astype(int)
这既避免了临时的,又加快了计算速度


并不是说你应该使用
np.clip
函数,Pythran也支持它。

我认为像Numba、Cython(不熟悉Pythran)这样的解决方案是为了加速计算。然而,对于处理大型数据集,有一个Dask,如所述,它处理块中的数据。