公告:本站正式转型为非交互式静态网站!
转型:本站将通过笔记和博客的形式继续为大家服务,关于 Mathematica 问答服务请移步至QQ群:365716997
联系:如有问题请联系QQ群管理员,或发送邮件至:lixuan.xyz@qq.com。
感谢:最后非常感谢大家多年来的支持与帮助!
参考《互联网跟帖评论服务管理规定》《中华人民共和国网络安全法》《网络信息内容生态治理规定》《互联网用户账号信息管理规定》

—— 2022-11-27

欢迎来到 Mathematica 问答社区

提问时请贴上文本代码

语法高亮:在编辑器中点击

被禁止的话题:广告破解

请阅读:《提问的智慧》

备用域名:mma.ooo

支持LaTex数学公式
行内公式标识符:\$ 或“$\backslash ($”+“$\backslash )$”,
行间公式标识符:\$\$ 或 “$\backslash [$”+“$\backslash ]$”

社区建议QQ群:365716997

分类

0 投票
1.4k 浏览
AbsoluteTiming[
Table[
  Sum[
   BesselJ[0, 10^-9 k]/(n + 1.6^k), {k, 0, 10000}
   ]
  , {n, 0, 12}]
]

(* {5.67253, {etc.}} *)

AbsoluteTiming[
ParallelTable[
  Sum[
   BesselJ[0, 10^-9 k]/(n + 1.5^k), {k, 0, 10000}
   ]
  , {n, 0, 12}]
]

(* {1.89187, {etc.}} *)

将上面的代码写成一个程序包

BeginPackage["package`"];
function::usage = "function[x] is a function to calculate stuff";
RunInParallel::usage = "RunInParallel is an option for function which determines whether it runs in parallel or not.";
Begin["Private`"];

Options[function] = {RunInParallel -> False};

function[x_, OptionsPattern[]] := Block[{TableCommand, SumCommand},
  Which[
   OptionValue[RunInParallel] === False,
    TableCommand = Table; SumCommand = Sum;,
   OptionValue[RunInParallel] === True,
   TableCommand = ParallelTable; SumCommand = Sum;,
   True, TableCommand = OptionValue[RunInParallel][[1]]; 
   SumCommand = OptionValue[RunInParallel][[2]];
   ];
  TableCommand[
   SumCommand[
    BesselJ[0, 10^-9 k]/(n + x^k), {k, 0, 50000}
    ]
   , {n, 0, 12}]
  ]

End[];
EndPackage[];

函数选项中有并行运算的选项

AbsoluteTiming[function[1.1, RunInParallel -> True]]
AbsoluteTiming[function[1.2, RunInParallel -> False]]

(* {31.465, {etc.}} *)
(* {34.5198, {etc.}} *)

已经设置了并行运算,但是时间并没有减少

但是这样设置后,就可以进行并行处理

AbsoluteTiming[Activate[function[1.9, RunInParallel -> {Inactive[ParallelTable], Inactive[Sum]}]]]
AbsoluteTiming[Activate[function[1.8, RunInParallel -> {Inactive[Table], Inactive[Sum]}]]]

(* {11.7112, {etc.}} *)
(* {35.7969, {etc.}} *)

时间明显减少,请问前面进行并行设置,但是结果并没有改变,是因为什么?

用户: 落雨流觞 (1.1k 分)
第一种设置方法在我这里可以并行,你再试试?
你指的是写成程序包之后,加载程序包,调用程序包函数,可以进行并行操作?
直接用代码,确实可以进行并行处理,关键是写成程序包之后,才会出现无法进行并行操作的问题、

1个回答

0 投票
 
已采纳

改了一下,去掉了不相关的语句,但仍保持原作者主要思路:

BeginPackage["package`"];
function::usage = "function[x] is a function to calculate stuff";
Begin["Private`"];

function[x_, OptionsPattern["RunInParallel" -> False]] := 
Block[{TableCommand = Table},
If[OptionValue["RunInParallel"], TableCommand = ParallelTable];
Return[TableCommand[
Sum[BesselJ[0, 10^-9 k]/(n + x^k), {k, 0, 20000}], {n, 0, 12}]];
]

End[];
EndPackage[];

运行

AbsoluteTiming[function[1.9];]
AbsoluteTiming[function[1.9, "RunInParallel" -> True];]
(*{12.4,Null}*)
(*{4.6,Null}*)

 

用户: 野鹤 (5.1k 分)
采纳于 用户:落雨流觞
我很好奇,之前不能并行,问题出在哪里?我仔细看了SE上面的解释,说跟程序包上下文环境设置有关系,我并不是很了解。
http://mathematica.stackexchange.com/questions/111448/paralleltable-behaves-differently-when-it-is-run-inside-a-package
...