不,它不花费额外的内存通过表情。正如通常的函数式语言一样,Mathematica对象是immutable:它们不能被修改,而是在使用某些函数转换它们时创建一个新对象。这也意味着如果你不转换它们,不管它们在函数之间传递多少,它们都不会被复制。
从用户的角度来看,数学表达式树,但我相信,在内部它们存储为directed acyclic graphs,即相同的子表达式可以在内存中存储的只有一次,不管有多少次出现在完整的表达(参见例如Share[]
的文档页面)。
下面是一个例子来说明:
首先,确保In
/Out
不占用额外的内存:
In[1]:= $HistoryLength = 0;
查看内存使用情况:
In[2]:= MemoryInUse[]
Out[2]= 13421756
让我们的表达占用大量内存:
In[3]:= s = [email protected][1000000];
In[4]:= MemoryInUse[]
Out[4]= 17430260
现在重复这个表达式一百遍......
In[5]:= t = ConstantArray[s, 100];
...并注意内存的使用情况几乎没有增加:
In[6]:= MemoryInUse[]
Out[6]= 18264676
ByeCount[]
是误导,因为它不报告的实际物理内存使用,但将用于如果公共子不允许共享相同的内存内存:
In[7]:= ByteCount[t]
Out[7]= 400018040
有趣的一点要注意:如果你从s
删除f[...]
,并且使双方s
和t
一个普通的数字阵列,那么这个内存共享不会发生,和内存使用率会跳转到〜400 MB。
无论你做tree
一个全局变量或getChildren
的说法,它不会使内存使用情况的差异。
你说的意思是“有没有办法让一个变量全局到整个笔记本“?如果你定义了'tree = 5',那么在'Global'上下文中(这是默认的),'tree'是无处不在的。默认情况下它是全局的,除非你在其他行为之后。 – acl