如题问,例如:
for i in arr:
do_a(i)
for i in arr:
do_b(i)
变为:
for i in arr:
do_a(i)
do_b(i)
1
Vegetable 2020-03-16 16:37:36 +08:00 2
没有,python 的 for 虽然效率很低,也不至于因为少数一遍 12345 就得到显著提高。
|
2
autoxbc 2020-03-16 19:56:14 +08:00
第一种代码不美
|
3
crella 2020-03-16 23:25:36 +08:00 via Android
额,python 不熟悉,在 ruby 里面,用 array.each do |x|,不会把 x 暴露给循环以后的代码,但是用 for x in array 则会暴露。
所以如果是在 ruby 里面且 do_a()和 do_b()可能有冲突的情况下,还是分别在两个 array.each 里面对应执行 do()比较好 |
4
vk42 2020-03-16 23:52:58 +08:00
这个没有普适的回答。比如如果两个循环各自操作的数据刚好可以放下 cache,而两个循环的数据又刚好有冲突,那么分开性能会更好
|
5
dremy 2020-03-17 01:43:48 +08:00 via iPhone
循环展开效率最高…
|
6
eason1874 2020-03-17 07:38:03 +08:00
看次数,一万几千次怎么方便怎么来,到十万次级别才能看出差距。
你试试搞个二十万次,啥也不干,纯粹是循环也耗费不少时间。 |
7
Mithril 2020-03-17 08:27:51 +08:00
只看你这代码没区别。
一般想要优化的话,你要优先考虑 do_a 和 do_b 这俩函数里面如何分配和使用 cache 的。在尽量保证 cache 不会 miss 的前提下,再考虑要不要合并。 其次考虑使用并行指令,比如一次循环执行多次计算,使用 SSE,AVX 等等指令硬写。不过 python 里面很难做到。这个基本相当于手动在做循环展开。 当然最优先的,是要确定这地方确实是性能瓶颈。不做 profile 就瞎优化完全是在浪费时间。 |