性能-字典使用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
如果可能的话,它将是最理想的解决方案(可能是性能方面最适用的方法).
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报