python - 用 joblib Parallel 填充数组
问题描述
from joblib import Parallel, delayed
import numpy as np
n = 10
l = np.random.randn(n,50)
a = np.zeros(n)
def myfun(i):
for k in range(5):
a[i] = np.correlate(l[0],l[i])[0]
Parallel(n_jobs=6,max_nbytes='50M')(map(delayed(myfun), range(n)))
>> a
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
为什么数组a
没有被填充?
解决方案
正在修改的内部数组与a
该函数外部的数组不同。我不知道 Parallel 调用是做什么的,但它似乎在复制数组并且您的函数对副本进行操作。也许它克隆了整个全球环境。myfun()
a
a
这是您的代码的简化版本,它使我所说的更清楚(我尝试添加global
调用希望可以解决它,但不是):
from joblib import Parallel, delayed
import numpy as np
n = 10
a = np.zeros(n)
a[1] = 33
def myfun(i):
global a
a[2] = i
print(a)
Parallel(n_jobs=6,max_nbytes='50M')(map(delayed(myfun), range(n)))
print()
print(a)
结果:
[ 0. 33. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 33. 1. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 33. 2. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 33. 3. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 33. 4. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 33. 5. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 33. 6. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 33. 7. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 33. 8. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 33. 9. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 33. 0. 0. 0. 0. 0. 0. 0. 0.]
推荐阅读
- spring - Spring batch - 项目阅读器知道阅读器处理的最后一条记录
- ios - 使用 DispatchGroup 时异步调用阻塞主线程
- json - Swagger - OpenAPI 3.0:在 RequestBody 中定义附加属性以表示 JSON
- javascript - Eslint 插件不工作,默认为推荐规则
- scripting - 在 korn shell 脚本中访问环境变量
- grep - 如何在 Terraform local-exec 命令行中转义特殊字符
- xamarin.forms - 使用 NavigationService.SelectTabAsync 时不调用 OnNavigatedTo
- google-sheets - 使用查询和多个导入范围时,Arrayformula 未填充列
- r - 如何使用块最大值函数和解决块最大值错误
- bash - 在 macOS 上使用 Bash 递归地重命名文件和目录