V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
shayuvpn0001
V2EX  ›  程序员

关于 Python 中集合的遍历效率的问题

  •  
  •   shayuvpn0001 · 2017-07-25 10:30:32 +08:00 · 2898 次点击
    这是一个创建于 2682 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在看 Python,有一个问题想请教一下各位:

    使用以下几种方式遍历一个集合的时候,哪个效率更高?
    下面 myList 是一个 list,
    1,使用 for each in myList
    2,使用 for idx, val in enumerate(myList)
    3,使用 for i in range(0, len(myList))

    此外,我个人理解的是 3 是属于有序遍历,如果中间缺少一个元素,则可能返回为空或者异常。而 1,2 都不会有这个问题。比如 myList 可能会有元素增减,如果增减发生在中间部分,方法 3 是不是可能产生异常?

    刚刚上手,希望各位多指导。谢谢~

    7 条回复    2017-07-25 19:17:56 +08:00
    jmc891205
        1
    jmc891205  
       2017-07-25 10:57:48 +08:00
    集合是 set 你在问的是列表 list

    不管怎么遍历 list 都是 O(n) 这是数据结构决定的 不以语法糖为转移

    遍历的时候不要修改你在遍历的 list 可以另建一个 list 把你需要的 list 存进去
    binfengxy
        2
    binfengxy  
       2017-07-25 11:10:08 +08:00
    for each in myList
    用最基础的吧,好像 python3+都在底层做了处理
    liuminghao233
        3
    liuminghao233  
       2017-07-25 11:16:01 +08:00 via iPhone
    遍历的效率还有区别的吗 23333
    princelai
        4
    princelai  
       2017-07-25 12:00:26 +08:00 via Android
    听说推导式比 for 高效一点,前提是 for 里的处理不那么复杂
    princelai
        5
    princelai  
       2017-07-25 12:07:10 +08:00 via Android
    另外如果你只是加减乘除,且数据足够大,为何不用 numpy,广播操作和 ufunc 效率极高,当然你也可以 numba 手动优化
    cloudyplain
        6
    cloudyplain  
       2017-07-25 16:24:16 +08:00
    cython 推荐使用 3,其他应该都差不多,可以看看生成的字节码
    vTexEZDota
        7
    vTexEZDota  
       2017-07-25 19:17:56 +08:00
    前面两个是通过迭代器遍历,速度快一点。List 在遍历的时候不可以修改长度。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3192 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:05 · PVG 21:05 · LAX 05:05 · JFK 08:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.