DistributeDefinitions[s1,s2,…]
将符号 si 的所有定义分配给所有并行内核.
DistributeDefinitions["context`"]
分配指定上下文下的所有符号定义.
DistributeDefinitions
DistributeDefinitions[s1,s2,…]
将符号 si 的所有定义分配给所有并行内核.
DistributeDefinitions["context`"]
分配指定上下文下的所有符号定义.
更多信息和选项
- DistributeDefinitions 实际上把 ParallelEvaluate 应用到符号 si 的所有赋值和属性上,不仅包括拥有值,还包括下值、上值及其它类型的值.
- DistributeDefinitions 将其自身递归地应用于符号 si 的定义中出现的任何符号.
- DistributeDefinitions 有属性 HoldAll.
- DistributeDefinitions 实际上“记录”符号 si 的定义,这样它们可以自动的分配到可能启动的每个新并行内核中.
- 对于任何表达式 expr,DistributeDefinitions[expr] 分配所有 expr 中出现的符号定义.
- 可给出以下选项:
-
DistributedContexts $DistributedContexts 分配时要考虑的符号的上下文 ProgressReporting $ProgressReporting 是否汇报计算进度 - 只有那些上下文位于 DistributedContexts 选项所提供上下文列表中的符号,才会被考虑进行定义的分配.
- ProgressReporting 选项用于指定是否报告定义分配的进度.
- DistributeDefinitions 返回用 HoldForm 包装的实际分配的符号列表. 定义未变的符号不包括在内.
范例
打开所有单元 关闭所有单元基本范例 (2)
LaunchKernels[];$KernelCountctx`y = 42;ParallelEvaluate[ToString[ctx`y]]$DistributedDefinitionsDistributeDefinitions[ctx`y]ParallelEvaluate[ToString[ctx`y]]$DistributedDefinitionsy = 43;ParallelEvaluate[ToString[y]]$DistributedDefinitions范围 (5)
ni = 5;nd := $KernelID
DistributeDefinitions[ni, nd]ParallelEvaluate[{ni, nd}]nfactors[n_] := Total[FactorInteger[(10 ^ n - 1/9)][[All, 2]]]
DistributeDefinitions[nfactors]ParallelMap[nfactors, Range[50, 70]]g/:f[g[x_]] := fg[x, $KernelID]
DistributeDefinitions[g]ParallelMap[f, {g[1], h[2], g[3]}]np = 5;Protect[np]
DistributeDefinitions[np]ParallelEvaluate[np = $KernelID, First[Kernels[]]]f[x_] := N[Pi ^ x, $prec];$prec = 50;DistributeDefinitions[Evaluate[Context[]]];ParallelEvaluate[f[$KernelID]]推广和延伸 (1)
属性和关系 (7)
DistributeDefinitions 会覆盖任何前面出现的值和属性:
ParallelEvaluate[f[0] = "Zero";f[x_] := x ^ 2, DistributedContexts -> None];ParallelMap[f, {0, 1, 2, 3, 4}, DistributedContexts -> None]f[x_] := x ^ 2
DistributeDefinitions[f]ParallelMap[f, {0, 1, 2, 3, 4}, DistributedContexts -> None]f[x_] := Labeled[Framed[x ^ 2], $KernelID]
DistributeDefinitions[f];ParallelMap[f, {1, 2, 3, 4}]ClearAll[f];DistributeDefinitions[f];ParallelMap[f, {1, 2, 3, 4}]DistributeDefinitions 使用 ParallelEvaluate 来把定义传输给所有内核:
f[n_] := PrimeQ[2 ^ n - 1]DistributeDefinitions[f];一个明确的 ParallelEvaluate 做同样的事情:
ParallelEvaluate[g[n_] := PrimeQ[2 ^ n + 1]];ParallelEvaluate[Through[{Identity, f, g}[$KernelID]]]对新内核记录分配好的定义;ParallelEvaluate 的效果则不是:
CloseKernels[];LaunchKernels[];ParallelEvaluate[Through[{Identity, f, g}[$KernelID]]]ftest[n_] := Labeled[Framed[PrimeQ[2 ^ n - 1]], $KernelID]ParallelMap[ftest, Range[1275, 1285]]gtest[n_] := Labeled[Framed[PrimeQ[2 ^ n - 1]], $KernelID]DistributeDefinitions[gtest];ParallelMap[gtest, Range[1275, 1285], DistributedContexts -> None]ParallelEvaluate[xr = 5]DistributeDefinitions[xr]ParallelTable[Sqrt[i] / xr, {i, 5}]xr = 6;ParallelTable[Sqrt[i] / xr, {i, 5}]使用 ParallelNeeds 在所有并行内核上设置程序包:
Needs["GraphUtilities`"]
ParallelNeeds["GraphUtilities`"]ParallelEvaluate[HamiltonianCycles[CompleteGraph[3], All]]使用 DistributeDefinitions 设置您自己的定义:
hcg[n_] := HamiltonianCycles[CompleteGraph[n], All]DistributeDefinitions[hcg];ParallelMap[hcg, Range[4]]$DistributedDefinitions 给出了所有已分配定义的符号列表:
a = 2;b = 3;DistributeDefinitions[a]$DistributedDefinitionsParallelEvaluate[b]$DistributedDefinitions可能存在的问题 (5)
ftest[n_] := Labeled[Framed[PrimeQ[2 ^ n - 1]], $KernelID]ParallelEvaluate[ftest[$KernelID], DistributedContexts -> None]DistributeDefinitions[ftest];ParallelEvaluate[ftest[$KernelID], DistributedContexts -> None]DistributeDefinitions 的使用并不会阻止定义的自动分配:
f[i_] := {i, $KernelID}
DistributeDefinitions[f];Clear[f]Parallelize[Map[f, Range[8]]]g[i_] := {i, $KernelID}
DistributeDefinitions[g];Clear[g]Parallelize[Map[g, Range[8]], DistributedContexts -> None]ParallelEvaluate[h[i_] := {i, $KernelID}];Parallelize[Map[h, Range[8]]]data = RandomReal[{-1, 1}, 1000];
fdata = ListInterpolation[data]Timing[Table[fdata[r], {r, 1.0, 1000, 0.1}];]DistributeDefinitions[fdata];ParallelEvaluate[Timing[Table[fdata[r], {r, 1.0, 1000, 0.1}];], First[Kernels[]]]DistributeDefinitions[data, fdata]ParallelEvaluate[fdata = ListInterpolation[data];];ParallelEvaluate[Timing[Table[fdata[r], {r, 1.0, 1000, 0.1}];], First[Kernels[]]]fdata1 = fdata;
DistributeDefinitions[fdata1]ParallelEvaluate[fdata1 = fdata1];ParallelEvaluate[Timing[Table[fdata1[r], {r, 1.0, 1000, 0.1}];], Last[Kernels[]]]带有 ReadProtected 属性的符号定义不能被分发:
ftest[n_] := Labeled[Framed[PrimeQ[2 ^ n - 1]], $KernelID];
SetAttributes[ftest, ReadProtected]DistributeDefinitions[ftest]ParallelMap[ftest, Range[$KernelCount]]a = 2;b = 3;DistributeDefinitions[a, b]b = 4;DistributeDefinitions[a, b]$DistributedDefinitions相关指南
-
▪
- 并行计算安装和配置 ▪
- 并行计算中的资源共享 ▪
- 并行计算 ▪
- 数据并行化
文本
Wolfram Research (2008),DistributeDefinitions,Wolfram 语言函数,https://reference.wolfram.com/language/ref/DistributeDefinitions.html (更新于 2025 年).
CMS
Wolfram 语言. 2008. "DistributeDefinitions." Wolfram 语言与系统参考资料中心. Wolfram Research. 最新版本 2025. https://reference.wolfram.com/language/ref/DistributeDefinitions.html.
APA
Wolfram 语言. (2008). DistributeDefinitions. Wolfram 语言与系统参考资料中心. 追溯自 https://reference.wolfram.com/language/ref/DistributeDefinitions.html 年
BibTeX
@misc{reference.wolfram_2026_distributedefinitions, author="Wolfram Research", title="{DistributeDefinitions}", year="2025", howpublished="\url{https://reference.wolfram.com/language/ref/DistributeDefinitions.html}", note=[Accessed: 13-September-2026]}
BibLaTeX
@online{reference.wolfram_2026_distributedefinitions, organization={Wolfram Research}, title={DistributeDefinitions}, year={2025}, url={https://reference.wolfram.com/language/ref/DistributeDefinitions.html}, note=[Accessed: 13-September-2026]}