0

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

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

我知道像numbapythran这样的包可以帮助提高操作数组时的性能,但我不清楚它们是否可以自动处理就地操作,避免临时对象......?

作为一个简单的例子,这是我必须在大型数组上使用的一个函数:

def find_bins(a, indices):
    global offset, width, nstep
    i = (a-offset) *nstep/ width 
    i = np.where(i<0,0,i)
    i = np.where(i>=nstep,nstep, i)
    indices[:] = i.astype(int)

所以混合算术运算和调用 numpy 函数的东西。

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

感谢您的任何提示!

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

4

2 回答 2

1

Pythran通过设计避免了许多临时数组。对于您指向的简单表达式,那就是


#pythran export find_bins(float[], int[], float, float, int)
import numpy as np
def find_bins(a, indices, offset, width, nstep):
    i = (a-offset) *nstep/ width #
    i = np.where(i<0,0,i)
    i = np.where(i>=nstep,nstep, i)
    indices[:] = i.astype(int)

这既避免了临时计算又加速了计算。

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

于 2020-09-09T07:51:12.657 回答
0

使用 numexpr。例如:

import numexpr
numexpr.evaluate("a+b*c", out=a)

这可以帮助您避免 tmp 变量,您可以参考高性能 Python、MG、IO

于 2020-06-24T05:12:18.053 回答