返回

性能-字典使用numba njit并行化来加速代码的问题

发布时间:2022-04-15 13:54:30 399
# python# 数据
 
我想通过改进并行化或…如果可能的话,改进代码编写风格,尽可能地加快代码的编写速度。其他解决方案的性能也将进行评估。但我认为上述方法是解决这个问题的最佳选择。
建议的答案必须能够在具有(至少i5 ram 16)或google Collaboratory的家用计算机上运行大数据量;我将添加一些大数据进行测试。
如果能获得最佳性能,使用字典(相关代码行)将很有意义。如果没有,字典可以通过列表或…(获得最佳性能是最重要的问题。如果可能的话,在代码运行后创建所需的字典是有意义的)。

我已经写了一段代码,并尝试使用numba来加速代码。代码的主要目标是根据条件对一些值进行分组。在这方面,iter_用于收敛代码以满足条件。我在下面准备了一个小案例来重现示例代码:

import numpy as np
import numba as nb

rng = np.random.default_rng(85)

values_ = {'R0': np.array([0.01090976, 0.01069902, 0.00724112, 0.0068463 , 0.01135723, 0.00990762,
                                       0.01090976, 0.01069902, 0.00724112, 0.0068463 , 0.01135723]),
           'R1': np.array([0.01836379, 0.01900166, 0.01864162, 0.0182823 , 0.01840322, 0.01653088,
                                       0.01900166, 0.01864162, 0.0182823 , 0.01840322, 0.01653088]),
           'R2': np.array([0.02430913, 0.02239156, 0.02225379, 0.02093393, 0.02408692, 0.02110411,
                                       0.02239156, 0.02225379, 0.02093393, 0.02408692, 0.02110411])}

params = {'R0': [3, 0.9490579204466154, 1825, 7.070272000000002e-05],
          'R1': [0, 0.9729203826820172, 167 , 7.070272000000002e-05],
          'R2': [1, 0.6031363088057902, 1316, 8.007296000000003e-05]}

Sno, dec_, upd_ = 2, 100, 200

# values_ = [*values_.values()]
# params = [*params.values()]


# @nb.jit(forceobj=True)
# def test(values_, params, Sno, dec_, upd_):

final_dict = {}
for i, j in enumerate(values_.keys()):
    Rand_vals = []
    goal_sum = params[j][1] * params[j][3]
    tel = goal_sum / dec_ * 10
    if params[j][0] != 0:
        for k in range(Sno):
            final_sum = 0.0
            iter_ = 0
            t = 1
            while not np.allclose(goal_sum, final_sum, atol=tel):
                iter_ += 1
                vals_group = rng.choice(values_[j], size=params[j][0], replace=False)
                final_sum = 0.0016 * np.sum(vals_group)
                if iter_ == upd_:
                    t += 1
                    tel = t * tel
            values_[j] = np.delete(values_[j], np.where(np.in1d(values_[j], vals_group)))
            Rand_vals.append(vals_group)
    else:
        Rand_vals = [np.array([])] * Sno
    final_dict["R" + str(i)] = Rand_vals

#    return final_dict


# test(values_, params, Sno, dec_, upd_)

首先,为了在这段代码上应用numba@nb.jit被使用(forceobj=True用于避免对性能产生不利影响的警告和警告。nopython也被检查过了@nb.njit由于不支持(如1,2所述)而导致以下错误字典类型其中:

无法确定<类“dict”>

我不知道这件事能不能由我来处理Dict从…起numba.typed(通过将创建的python字典转换为numba Dict)或字典数组列表我有任何优势。我认为,如果一些代码行,例如。Rand_vals.append(vals_group)其他部分或者…从函数中删除或修改,以获得与以前相同的结果,但我不知道如何做到这一点。

我将非常感谢您在这个代码上帮助使用numba。numba parallelization如果可能的话,它将是最理想的解决方案(可能是性能方面最适用的方法).

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(1)
按点赞数排序
用户头像