下面的for循环和函数如何加速应用?

时间:2019-05-15 05:02:26

标签: python-3.x numpy iteration batch-processing funcy

我有以下for循环:

for j in range(len(list_list_int)):
    arr_1_, arr_2_, arr_3_ = foo(bar, list_of_ints[j])
    arr_1[j,:] = arr_1_.data.numpy()
    arr_2[j,:] = arr_2_.data.numpy()
    arr_3[j,:] = arr_3_.data.numpy()

我想对多处理应用foo,主要是因为这需要花费大量时间才能完成。我尝试使用funcy's块方法批量进行此操作:

for j in chunks(1000, list_list_int):
    arr_1_, arr_2_, arr_3_ = foo(bar, list_of_ints[j])
    arr_1[j,:] = arr_1_.data.numpy()
    arr_2[j,:] = arr_2_.data.numpy()
    arr_3[j,:] = arr_3_.data.numpy()

但是,我得到list object cannot be interpreted as an integer。通过多处理应用foo的正确方法是什么?

3 个答案:

答案 0 :(得分:5)

series: [{
        name: 'Speed',
            dial: {
                    backgroundColor:'#D9972E',
                    radius: '100%',
                    baseWidth: 5,
                        baseLength: '5%',
                        baseWidth: 10,
                        rearLength: '0%',
                },
        data: [80],
        tooltip: {
            valueSuffix: ' km/h'
        }
    }]

答案 1 :(得分:2)

我没有安装chunks,但是我怀疑它会从文档中生成(对于2块大小的文件,来自:

alist = [[1,2],[3,4],[5,6],[7,8]]                                     
j = [[1,2],[3,4]]
j = [[5,6],[7,8]]   

会产生错误:

In [116]: alist[j]                                                              
TypeError: list indices must be integers or slices, not list

如果您的foo无法使用完整的列表列表,则看不到将其拆分成大块的列表将如何工作。显然,一次只能使用一个子列表。

答案 2 :(得分:2)

如果您希望对numpy数组执行并行操作,那么我将使用Dask

仅需几行代码,您的操作应该可以轻松地在多个进程上运行,并且高度发达的Dask调度程序将为您平衡负载。与其他并行库(如joblib)相比,Dask的一个巨大好处是它可以维护本机numpy API。

import dask.array as da

# Setting up a random array with dimensions 10K rows and 10 columns
# This data is stored distributed across 10 chunks, and the columns are kept together (1_000, 10)
x = da.random.random((10_000, 10), chunks=(1_000, 10))
x = x.persist()  # Allow the entire array to persist in memory to speed up calculation


def foo(x):
    return x / 10


# Using the native numpy function, apply_along_axis, applying foo to each row in the matrix in parallel
result_foo = da.apply_along_axis(foo, 0, x)

# View original contents
x[0:10].compute()

# View sample of results
result_foo = result_foo.compute()
result_foo[0:10]