3

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

 1 year ago
source link: https://www.v2ex.com/t/883749
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

V2EX  ›  Python

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

  a784066538 · 8 小时 47 分钟前 · 1648 次点击

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

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

17 条回复    2022-09-29 18:33:22 +08:00
Building

Building      8 小时 45 分钟前   ❤️ 1

提前用字典存好
eason1874

eason1874      8 小时 25 分钟前

提前存好 +1

最朴素的方法往往是最有效的
dcty

dcty      8 小时 23 分钟前 via iPhone

空间换时间
SimonOne

SimonOne      8 小时 20 分钟前

请问 while 循环的间隔是 0.2s-0.3s 左右,有方法可以减少吗?
lookStupiToForce

lookStupiToForce      8 小时 13 分钟前

把多层循环的内容根据逻辑改写难易丢 numpy 、丢 pandas 、丢数据库,最不济丢其他性能高的语言去处理呗

像你题目中说的,感觉用一个 df.apply 就能解决,前提是 merge 上必要的信息列
wxf666

wxf666      8 小时 13 分钟前

同意 #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      8 小时 7 分钟前

用二维数据结构组织既有信息

也就是楼上说的用 map 或者 dict 来做
wcsjtu

wcsjtu      8 小时 0 分钟前

思路一:修改逻辑, 不要用 for 循环
思路二:实在要用 for ,改成 C/C++循环, 可以使用 mypyc 编译该部分代码, 也可以用 cython 编译。mypyc 有语法要求, 性能稍微好一点。cython 可以直接编,性能比较差,但是还是远比 Python for 循环好

我们团队搞了一个专门为 Python 业务逻辑加速的编译器,性能吊打 cython/mypyc/pypy , 可惜不能开源.......
liuxingdeyu

liuxingdeyu      7 小时 56 分钟前

map reduce ?
xsourse

xsourse      5 小时 59 分钟前

numba
princelai

princelai      5 小时 8 分钟前

@xsourse #11 numba 不支持 list 结构,他这个 for in 明显是从序列中遍历呢,这个方法不行
ericgui

ericgui      5 小时 2 分钟前

用空间换时间,这是最简单的一个算法技巧
a784066538

a784066538      5 小时 2 分钟前

@wxf666 有思路了!感谢大佬!
leonhao

leonhao      4 小时 31 分钟前

多刷 leetcode
LeegoYih

LeegoYih      4 小时 25 分钟前

karloku

karloku      1 小时 14 分钟前

长列表遍历本来就慢, python 的循环更是慢中慢...
提前分类, 字典存好比较好

关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2749 人在线   最高记录 5497   ·  

创意工作者们的社区

World is powered by solitude

VERSION: 3.9.8.5 · 43ms · UTC 11:47 · PVG 19:47 · LAX 04:47 · JFK 07:47
Developed with CodeLauncher
♥ Do have faith in what you're doing.


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK