我如何将列表中的每个元素应用于函数中的每个参数?有点像Map,除了可变数量的参数.
因此,举例来说,如果我有一个功能action[x1_,x2_,x3_]:=...,我有一个名单{1,2,3},我将如何创建一个函数调用action与action[1,2,3]?
我希望这个函数能够处理我现在更改action为action[x1_,x2],以及其他任何内容{1,2},以及现在调用操作action[1,2].
我需要在一长串对中找到所有数字对的总和.在Mathematica中有很多方法可以做到这一点,但我正考虑使用其中任何一个Plus或Total.由于Total在列表上工作,Map是在那里使用的函数式编程工具,Apply在级别1(@@@)是要使用的Plus,因为Plus要将数字作为参数添加.
这是一些演示代码(警告:在执行此操作之前保存所有工作!):
pairs = Tuples[Range[6000], {2}]; (* toy example *)
TimeConstrained[Plus @@@ pairs; // Timing, 30]
(* Out[4]= {21.73, Null} *)
Total /@ pairs; // Timing
(* Out[5]= {3.525, Null} *)
Run Code Online (Sandbox Code Playgroud)
您可能已经注意到我已添加TimeConstrained到代码中Plus.这是我为你提供的保护措施,因为裸代码使我的PC几乎瘫痪.事实上,上面的代码对我有用,但如果我将第一行的范围增加到7000,我的计算机就会锁定并且永远不会回来.什么都行不通,没有alt-period,程序切换,ctrl-alt-delete,尝试使用任务栏启动进程管理器,关闭笔记本电脑盖让它睡觉等等,真的没什么.
问题是由Plus @@@ pairs线路的极端内存使用引起的.虽然'对'本身占用大约288 MB,而总数的一半,但Plus系列的计算速度很快消耗约7 GB.这是我的免费物理内存的结束,任何更大的内容都会导致在磁盘上使用虚拟内存.当使用虚拟内存时,Mathematica和/或Windows显然效果不佳(BTW,MacOS和Linux表现更好吗?).相反,Total行对内存使用情况图没有明显影响.
我有两个问题:
Plus和(Total如[Total]列表相当于Apply [Plus,list].)如何解释行为的极端差异?我认为这与之间的差异做Apply和Map,但我很好奇,所涉及的内部机制.MemoryConstrained,但是如果您怀疑Mathematica可能会占用您的所有系统资源,那么必须在任何地方使用它是一件痛苦的事.是否有一个全局设置可以告诉Mathematica仅为其所有操作使用物理内存(或者,最好是其中的某一部分)?这将是非常有帮助的,因为这种行为导致了过去几周的一些锁定,并且它真的开始惹恼我.