8e47e42
V2EX  ›  问与答

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

  •  
  •   8e47e42 · Mar 16, 2020 · 1573 views
    This topic created in 2255 days ago, the information mentioned may be changed or developed.

    如题问,例如:

    for i in arr:
        do_a(i)
    
    for i in arr:
        do_b(i)
    

    变为:

    for i in arr:
        do_a(i)
        do_b(i)
    
    7 replies    2020-03-17 08:27:51 +08:00
    Vegetable
        1
    Vegetable  
       Mar 16, 2020   ❤️ 2
    没有,python 的 for 虽然效率很低,也不至于因为少数一遍 12345 就得到显著提高。
    autoxbc
        2
    autoxbc  
       Mar 16, 2020
    第一种代码不美
    crella
        3
    crella  
       Mar 16, 2020 via Android
    额,python 不熟悉,在 ruby 里面,用 array.each do |x|,不会把 x 暴露给循环以后的代码,但是用 for x in array 则会暴露。

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

    你试试搞个二十万次,啥也不干,纯粹是循环也耗费不少时间。
    Mithril
        7
    Mithril  
       Mar 17, 2020
    只看你这代码没区别。
    一般想要优化的话,你要优先考虑 do_a 和 do_b 这俩函数里面如何分配和使用 cache 的。在尽量保证 cache 不会 miss 的前提下,再考虑要不要合并。
    其次考虑使用并行指令,比如一次循环执行多次计算,使用 SSE,AVX 等等指令硬写。不过 python 里面很难做到。这个基本相当于手动在做循环展开。
    当然最优先的,是要确定这地方确实是性能瓶颈。不做 profile 就瞎优化完全是在浪费时间。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1047 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 56ms · UTC 19:12 · PVG 03:12 · LAX 12:12 · JFK 15:12
    ♥ Do have faith in what you're doing.