gpt4 book ai didi

wolfram-mathematica - 制作表格的速度差异

转载 作者:行者123 更新时间:2023-12-03 21:40:22 25 4
gpt4 key购买 nike

我在看 a useful post at WRI blog on improving speed of code ,我需要帮助来理解这一点。

比较这些速度

Timing[
tbl = Table[i + j, {i, 1, 1000}, {j, 1, 1000}];
]

{0.031, Null}


Timing[
a = 1000;
tbl = Table[i + j, {i, 1, a}, {j, 1, a}];
]

{0.422, Null}

因此,将限制的实际值放在表本身内部而不是外部时要快得多。对此的解释,我确信它是正确的,但我需要帮助理解,是 Table如果它的限制是数字而不是数字则编译,这是因为它的属性是 HoldAll .

但我的问题是:上面的实际工作如何,因为对 Table 的限制无论如何必须在某一时刻变成数字?我写不出来
Clear[a]
tbl = Table[i + j, {i, 1, a}, {j, 1, a}]

上面给出了一个错误。

所以,对我来说,写 a=1000外面 Table与内部相比,应该没有区别,因为没有 a具有数值, Table[]什么也做不了。所以替换 aTable[] 之前,评估器必须在某个时间点出现数字 1000可以做任何有用的事情,不是吗?

换句话说,什么 Table最终应该看到的是 {i, 1, 1000}, {j, 1, 1000}在这两种情况下。

所以,我认为这会发生的方式是这样的:
  • 评估器替换 a由表
  • 的参数中的 1000
  • 评估员调用 Table结果,现在全是数字。
  • 表编译,现在运行速度更快。

  • 但似乎发生的事情是另一回事。 (由于 HoldAll?)
  • Table 按原样接受其参数。因为有HoldAll,所以看到a而不是 1000。
  • 它不调用 Compile,因为它的参数不全是数字。
  • 它现在生成一个带有 a 的表限制,评估者评估 a到 1000
  • 现在生成表,所有限制都是数字,但由于未编译代码,现在速度较慢。

  • 问题是:上面的那种情况会发生吗?有人可以解释解释这种时间差异的步骤吗?

    另外, 如何确保在两种情况下都编译表 在上面的例子中,即使使用一个变量作为限制?并非总是可以对表限制的数字进行硬编码,但有时必须为这些使用变量。是否应该明确使用 Compile命令? (我不直接使用 Compile,因为我认为它会在需要时自动完成)。

    编辑(1)

    回答 Mike 在下面的帖子中发现使用调用时没有时间差异。
    ClearAll[tblFunc];
    Timing[a = 1000;
    tblFunc[a_] := Table[i + j, {i, 1, a}, {j, 1, a}];
    Developer`PackedArrayQ[tblFunc[a]]
    ]


    {0.031, True}

    但那是因为 a现在是号码 1000在函数内部,一旦被调用。由于 M 通过 VALUE 传递事物。

    如果我们强制调用通过引用,那么 a未被评估,然后我们得到
    ClearAll[tblFunc];
    Timing[a = 1000;
    tblFunc[a_] := Table[i + j, {i, 1, a}, {j, 1, a}];
    Developer`PackedArrayQ[tblFunc[Unevaluated@a]]
    ]

    现在我们看到了预期的结果,因为现在 a在函数内部仍然是象征性的,我们回到了原点,现在它很慢,因为没有打包。并且由于未打包,因此未使用 Compile。
    {0.437, False}

    编辑(2)
    感谢大家的回答,我想我从他们那里学到了很多。

    这是一个执行摘要,只是为了确保我一切顺利。

    enter image description here

    编辑(3)

    以下是我专门与用于使 Mathematica 代码运行得更快的提示相关的链接。
  • http://library.wolfram.com/howtos/faster/
  • http://blog.wolfram.com/2011/12/07/10-tips-for-writing-fast-mathematica-code/
  • https://stackoverflow.com/questions/4721171/performance-tuning-in-mathematica
  • Using Array and Table Functions in Mathematica. Which is best when
  • 最佳答案

    所以这就是我认为正在发生的事情。您在 Table 上看到数字和符号限制之间速度变慢的原因是因为你做了一个双索引。每个子表(例如,遍历所有索引 j 以获取固定索引 i )是单独构造的,当限制是符号时,在构造每个子表之前需要额外的步骤来确定该限制。您可以通过检查来看到这一点,例如

    Trace[a = 3;
    tbl = Table[i + j, {i, 1, a}, {j, 1, a}];
    ]

    David给出了一个很好的例子,说明为什么要对每个子列表进行此检查。至于为什么 Mathematica 无法弄清楚何时不需要此检查,我不知道。如果您只有一个索引要求和,则符号版本和数字版本之间的速度没有区别
    Timing[tbl = Table[i + j, {j, 1, 1000}];]
    {0.0012, Null}

    Timing[a = 1000;
    tbl = Table[i + j, {j, 1, a}];
    ]
    {0.0013, Null}

    回答您对速度的跟进;制作 tbl对于数字和符号限制,函数更快。
    Timing[a = 1000;
    tblFunc[a_] := Table[i + j, {i, 1, a}, {j, 1, a}];
    tblFunc[a];
    ]

    {0.045171, Null}

    对比
    Timing[tbl = Table[i + j, {i, 1, 1000}, {j, 1, 1000}];]
    {0.066864, Null}

    Timing[a = 1000;
    tbl = Table[i + j, {i, 1, a}, {j, 1, a}];
    ]
    {0.632128, Null}

    如果您打算重复使用 tbl,您将获得更快的速度 build 。
    b=1000;
    Timing[tblFunc[b];]
    {0.000013, Null}

    关于wolfram-mathematica - 制作表格的速度差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8709170/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com