多个 For-loop 合并成一个 For-loop,执行内容不变,对执行效率有显著提高吗?

2020-03-16 16:28:46 +08:00
 8e47e42

如题问,例如:

for i in arr:
    do_a(i)

for i in arr:
    do_b(i)

变为:

for i in arr:
    do_a(i)
    do_b(i)
1177 次点击
所在节点    问与答
7 条回复
Vegetable
2020-03-16 16:37:36 +08:00
没有,python 的 for 虽然效率很低,也不至于因为少数一遍 12345 就得到显著提高。
autoxbc
2020-03-16 19:56:14 +08:00
第一种代码不美
crella
2020-03-16 23:25:36 +08:00
额,python 不熟悉,在 ruby 里面,用 array.each do |x|,不会把 x 暴露给循环以后的代码,但是用 for x in array 则会暴露。

所以如果是在 ruby 里面且 do_a()和 do_b()可能有冲突的情况下,还是分别在两个 array.each 里面对应执行 do()比较好
vk42
2020-03-16 23:52:58 +08:00
这个没有普适的回答。比如如果两个循环各自操作的数据刚好可以放下 cache,而两个循环的数据又刚好有冲突,那么分开性能会更好
dremy
2020-03-17 01:43:48 +08:00
循环展开效率最高…
eason1874
2020-03-17 07:38:03 +08:00
看次数,一万几千次怎么方便怎么来,到十万次级别才能看出差距。

你试试搞个二十万次,啥也不干,纯粹是循环也耗费不少时间。
Mithril
2020-03-17 08:27:51 +08:00
只看你这代码没区别。
一般想要优化的话,你要优先考虑 do_a 和 do_b 这俩函数里面如何分配和使用 cache 的。在尽量保证 cache 不会 miss 的前提下,再考虑要不要合并。
其次考虑使用并行指令,比如一次循环执行多次计算,使用 SSE,AVX 等等指令硬写。不过 python 里面很难做到。这个基本相当于手动在做循环展开。
当然最优先的,是要确定这地方确实是性能瓶颈。不做 profile 就瞎优化完全是在浪费时间。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/653299

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX