推荐学习书目
› Learn Python the Hard Way
Python Sites
› PyPI - Python Package Index
› http://diveintopython.org/toc/index.html
› Pocoo
值得关注的项目
› PyPy
› Celery
› Jinja2
› Read the Docs
› gevent
› pyenv
› virtualenv
› Stackless Python
› Beautiful Soup
› 结巴中文分词
› Green Unicorn
› Sentry
› Shovel
› Pyflakes
› pytest
Python 编程
› pep8 Checker
Styles
› PEP 8
› Google Python Style Guide
› Code Style from The Hitchhiker's Guide
DaChuiZi
V2EX  ›  Python

Python 多层 for 循环性能如何提高

  •  
  •   DaChuiZi · Sep 29, 2022 · 5737 views
    This topic created in 1500 days ago, the information mentioned may be changed or developed.

    在实际业务中不得不遍历多个嵌套 for 循环, 如何提高嵌套 for 循环的性能 耗时太长了~

    案例: 比如一把武器 for 一个武器 in 武器库: for 弹药 in 弹夹: if 弹药是否属于该武器: for 弹药属性 in 弹药: # 判断弹药是否支持攻击某种物体

    20 replies  •  2022-09-30 14:40:08 +08:00
    Building
    Building
    Sep 29, 2022❤️1
    1
    提前用字典存好
    eason1874
    eason1874
    Sep 29, 2022
    2
    提前存好 +1

    最朴素的方法往往是最有效的
    dcty
    dcty
    Sep 29, 2022 via iPhone
    3
    空间换时间
    SimonOne
    SimonOne
    Sep 29, 2022
    4
    请问 while 循环的间隔是 0.2s-0.3s 左右,有方法可以减少吗?
    lookStupiToForce
    lookStupiToForce
    Sep 29, 2022
    5
    把多层循环的内容根据逻辑改写难易丢 numpy 、丢 pandas 、丢数据库,最不济丢其他性能高的语言去处理呗

    像你题目中说的,感觉用一个 df.apply 就能解决,前提是 merge 上必要的信息列
    wxf666
    wxf666
    Sep 29, 2022
    6
    同意 #1

    1. 种类不多,你可以存成 `set[tuple[弹药, 该弹药能攻击的物体]]`:

    ```python
    弹药能攻击的物体 = {
     (弹药 1, 物体 1),
     (弹药 1, 物体 2),
     (弹药 2, 物体 1),
     (弹药 2, 物体 3),
    }
    ```

    判断:`if (弹药 1, 物体 1) in 弹药能攻击的物体:`


    2. 种类巨多,可能存成 `dict[弹药, set[该弹药能攻击的物体]]` 能省点内存?但比上面的慢

    ```python
    弹药能攻击的物体 = {
     弹药 1: {物体 1, 物体 2},
     弹药 2: {物体 1, 物体 3},
    }
    ```

    判断:`if 物体 1 in 弹药能攻击的物体[弹药 1]:`
    qW7bo2FbzbC0
    qW7bo2FbzbC0
    Sep 29, 2022
    7
    用二维数据结构组织既有信息

    也就是楼上说的用 map 或者 dict 来做
    wcsjtu
    wcsjtu
    Sep 29, 2022
    8
    思路一:修改逻辑, 不要用 for 循环
    思路二:实在要用 for ,改成 C/C++循环, 可以使用 mypyc 编译该部分代码, 也可以用 cython 编译。mypyc 有语法要求, 性能稍微好一点。cython 可以直接编,性能比较差,但是还是远比 Python for 循环好

    我们团队搞了一个专门为 Python 业务逻辑加速的编译器,性能吊打 cython/mypyc/pypy , 可惜不能开源.......
    liuxingdeyu
    liuxingdeyu
    Sep 29, 2022
    9
    map reduce ?
    xgdgsc
    xgdgsc
    Sep 29, 2022 via Android
    10
    xsourse
    xsourse
    Sep 29, 2022
    11
    numba
    princelai
    princelai
    Sep 29, 2022
    12
    @xsourse #11 numba 不支持 list 结构,他这个 for in 明显是从序列中遍历呢,这个方法不行
    ericgui
    ericgui
    Sep 29, 2022
    13
    用空间换时间,这是最简单的一个算法技巧
    DaChuiZi
    DaChuiZi
    OP
    Sep 29, 2022
    14
    @wxf666 有思路了!感谢大佬!
    leonhao
    leonhao
    Sep 29, 2022
    15
    多刷 leetcode
    LeegoYih
    LeegoYih
    Sep 29, 2022
    16
    手动展开
    karloku
    karloku
    Sep 29, 2022
    17
    长列表遍历本来就慢, python 的循环更是慢中慢...
    提前分类, 字典存好比较好
    scruel
    scruel
    Sep 29, 2022
    18
    当然是直接换 python 14
    [python14!]( https://miro.medium.com/max/1100/1*ieMH6ipGpq72fWnMiKweHA.png)
    xuanbg
    xuanbg
    Sep 30, 2022
    19
    全组合放数据库,直接查结果就行。
    wcsjtu
    wcsjtu
    Sep 30, 2022
    20
    @xsourse 这种情况,numba 没用的,绝对是负优化。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   783 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 51ms · UTC 18:55 · PVG 02:55 · LAX 10:55 · JFK 13:55
    ♥ Do have faith in what you're doing.