为啥将一行代码(可以做很多事情)分成许多较小的行运行 *so* 慢得多

Posted

技术标签:

【中文标题】为啥将一行代码(可以做很多事情)分成许多较小的行运行 *so* 慢得多【英文标题】:Whey does splitting a line of code into (that does many things) into many smaller lines run *so* much slower为什么将一行代码(可以做很多事情)分成许多较小的行运行 *so* 慢得多 【发布时间】:2020-09-18 19:22:51 【问题描述】:

这一切都在 python 3 中。我有一行代码基本上可以做到这一点:

somefloat += someDict(someList(someIndex1)))(someIndex2)

本质上,我拥有的是一个字典列表,每个字典都包含多个指向浮点列表的条目。 someIndex1 和 someIndex2 不相关,都是整数。 someList 是一个字符串列表。

但是,当我将其拆分为下面时,它最终会慢得多

val1 = someList(someIndex1)
val2 = someDict(val1)
val3 = val2(someIndex2)
somefloat += val3

我已经使用 kernprof 对上述内容进行了计时(它是大量嵌套的 - 超过 130,000 次调用)。结果如下:

案例 1 - 一个班轮:

案例 2 - 多线器:

所以你可以从上面看到,一个班轮比任何一个单独的单行略慢,但一个行比它的部分组合快几乎 4 倍。我对这种程度的放缓感到惊讶 - 我错过了什么,这仅仅是任何操作的成本超过了特定操作的成本吗?

【问题讨论】:

【参考方案1】:

每次为 val1、val2 和 val3 分配新值时,都需要将其写入某处。然后,它需要被访问以获得你想要的东西。 如果您的列表嵌套很深,并且您调用它们 130k+ 次,则每次都需要从所述变量中获取值,这可能会导致性能下降。

【讨论】:

以上是关于为啥将一行代码(可以做很多事情)分成许多较小的行运行 *so* 慢得多的主要内容,如果未能解决你的问题,请参考以下文章

我可以将我的长序列分成 3 个较小的序列并使用有状态 LSTM 处理 3 个样本吗?

C# 将一个数组分成多个较小的数组(随机)

将行中的列表拆分成多个分块的行

为啥 RMSE 值在较小的树上增加(RPART)

将列表拆分为较小的列表(分成两半)

怎么把一个较大的TXT文件分成几个较小的