在实际业务中不得不遍历多个嵌套 for 循环, 如何提高嵌套 for 循环的性能 耗时太长了~
案例: 比如一把武器 for 一个武器 in 武器库: for 弹药 in 弹夹: if 弹药是否属于该武器: for 弹药属性 in 弹药: # 判断弹药是否支持攻击某种物体
1
Building 2022-09-29 11:02:16 +08:00 1
提前用字典存好
|
2
eason1874 2022-09-29 11:22:26 +08:00
提前存好 +1
最朴素的方法往往是最有效的 |
3
dcty 2022-09-29 11:24:18 +08:00 via iPhone
空间换时间
|
4
SimonOne 2022-09-29 11:27:11 +08:00
请问 while 循环的间隔是 0.2s-0.3s 左右,有方法可以减少吗?
|
5
lookStupiToForce 2022-09-29 11:34:17 +08:00
把多层循环的内容根据逻辑改写难易丢 numpy 、丢 pandas 、丢数据库,最不济丢其他性能高的语言去处理呗
像你题目中说的,感觉用一个 df.apply 就能解决,前提是 merge 上必要的信息列 |
6
wxf666 2022-09-29 11:34:42 +08:00
同意 #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]:` |
7
qW7bo2FbzbC0 2022-09-29 11:40:32 +08:00
用二维数据结构组织既有信息
也就是楼上说的用 map 或者 dict 来做 |
8
wcsjtu 2022-09-29 11:47:10 +08:00
思路一:修改逻辑, 不要用 for 循环
思路二:实在要用 for ,改成 C/C++循环, 可以使用 mypyc 编译该部分代码, 也可以用 cython 编译。mypyc 有语法要求, 性能稍微好一点。cython 可以直接编,性能比较差,但是还是远比 Python for 循环好 我们团队搞了一个专门为 Python 业务逻辑加速的编译器,性能吊打 cython/mypyc/pypy , 可惜不能开源....... |
9
liuxingdeyu 2022-09-29 11:51:54 +08:00
map reduce ?
|
10
xgdgsc 2022-09-29 13:29:19 +08:00 via Android
|
11
xsourse 2022-09-29 13:47:57 +08:00
numba
|
13
ericgui 2022-09-29 14:45:07 +08:00
用空间换时间,这是最简单的一个算法技巧
|
15
leonhao 2022-09-29 15:16:10 +08:00
多刷 leetcode
|
16
LeegoYih 2022-09-29 15:22:31 +08:00
手动展开
|
17
karloku 2022-09-29 18:33:22 +08:00
长列表遍历本来就慢, python 的循环更是慢中慢...
提前分类, 字典存好比较好 |
18
scruel 2022-09-29 23:37:50 +08:00
当然是直接换 python 14
[python14!]( https://miro.medium.com/max/1100/1*ieMH6ipGpq72fWnMiKweHA.png) |
19
xuanbg 2022-09-30 08:36:51 +08:00
全组合放数据库,直接查结果就行。
|