为什么将一行代码拆分成(做很多事情)成许多更小的行 运行 *so* 慢得多
Whey does splitting a line of code into (that does many things) into many smaller lines run *so* much slower
这些都在 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 倍。我对这种程度的放缓感到惊讶 - 我错过了什么,这仅仅是任何操作的成本超过了特定操作的成本吗?
每次给val1、val2、val3赋新值时,都需要写在某处。然后,需要访问它才能得到你想要的。
如果你的列表嵌套很深,调用了 130k+ 次,每次都需要从所述变量中获取值,这会导致性能下降。
这些都在 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 倍。我对这种程度的放缓感到惊讶 - 我错过了什么,这仅仅是任何操作的成本超过了特定操作的成本吗?
每次给val1、val2、val3赋新值时,都需要写在某处。然后,需要访问它才能得到你想要的。 如果你的列表嵌套很深,调用了 130k+ 次,每次都需要从所述变量中获取值,这会导致性能下降。