V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
8e47e42
V2EX  ›  问与答

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

  •  
  •   8e47e42 · 2020-03-16 16:28:46 +08:00 · 1236 次点击
    这是一个创建于 1715 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题问,例如:

    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 条回复    2020-03-17 08:27:51 +08:00
    Vegetable
        1
    Vegetable  
       2020-03-16 16:37:36 +08:00   ❤️ 2
    没有,python 的 for 虽然效率很低,也不至于因为少数一遍 12345 就得到显著提高。
    autoxbc
        2
    autoxbc  
       2020-03-16 19:56:14 +08:00
    第一种代码不美
    crella
        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()比较好
    vk42
        4
    vk42  
       2020-03-16 23:52:58 +08:00
    这个没有普适的回答。比如如果两个循环各自操作的数据刚好可以放下 cache,而两个循环的数据又刚好有冲突,那么分开性能会更好
    dremy
        5
    dremy  
       2020-03-17 01:43:48 +08:00 via iPhone
    循环展开效率最高…
    eason1874
        6
    eason1874  
       2020-03-17 07:38:03 +08:00
    看次数,一万几千次怎么方便怎么来,到十万次级别才能看出差距。

    你试试搞个二十万次,啥也不干,纯粹是循环也耗费不少时间。
    Mithril
        7
    Mithril  
       2020-03-17 08:27:51 +08:00
    只看你这代码没区别。
    一般想要优化的话,你要优先考虑 do_a 和 do_b 这俩函数里面如何分配和使用 cache 的。在尽量保证 cache 不会 miss 的前提下,再考虑要不要合并。
    其次考虑使用并行指令,比如一次循环执行多次计算,使用 SSE,AVX 等等指令硬写。不过 python 里面很难做到。这个基本相当于手动在做循环展开。
    当然最优先的,是要确定这地方确实是性能瓶颈。不做 profile 就瞎优化完全是在浪费时间。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4986 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 09:58 · PVG 17:58 · LAX 01:58 · JFK 04:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.