请考虑:

Clear[x]
expr = Sum[x^i, {i, 15}]^30;

CoefficientList[expr, x]; // Timing
Coefficient[Expand@expr, x, 234]; // Timing
Coefficient[expr, x, 234]; // Timing

{0.047,空}

{0.047,空}

{4.93,空}

帮助状态:



在最后一种情况下,为什么Coefficient需要这么慢是有原因的吗?

最佳答案

除非它绝对必要,否则Coefficient将不会扩展。这确实可以避免内存爆炸。我相信从版本3开始就采用这种方式(我想我是在1995年左右开始从事此工作的)。

它也可以更快地避免扩展。这是一个简单的例子。

In[28]:= expr = Sum[x^i + y^j + z^k, {i, 15}, {j, 10}, {k, 20}]^20;

In[29]:= Coefficient[expr, x, 234]; // Timing

Out[29]= {0.81, Null}

但是,下一个似乎卡在了版本8中,并且在开发Mathematica(更改了Expand)的过程中至少花费了半分钟的时间。
Coefficient[Expand[expr], x, 234]; // Timing

可能应该添加一些试探法来寻找不会爆炸的单变量。不过,这似乎不是一个高优先级的项目。

丹尼尔·里奇布劳

关于performance - 系数功能慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8243627/

10-14 17:19