Python 的多层嵌套循环如何优化?

2022-10-31 11:15:57 +08:00
 mmm159357456
result = list()

for x1 in list_a:
    for x2 in list_b:
        for x3 in list_c:
            // 任意层,xn 皆为 f 的必要参数
            _r = f(x1, x2, x3, *args)
            result.append(_r)

众所周知的 python 循环执行慢,如上情形如何优化?

6429 次点击
所在节点    Python
72 条回复
mmm159357456
2022-11-01 09:32:29 +08:00
@wxf666 ok ,我参考下,谢谢
wxf666
2022-11-01 09:40:06 +08:00
@mmm159357456 写漏了。。使用方式应该要将结果转成 csv ,再重定向至文件:

```shell
sqlite3.exe -csv data.db < main.sql > result.csv
```
wxf666
2022-11-01 09:55:29 +08:00
@mmm159357456 这些都是单线程计算。

如果你是 8 核 CPU ,那可以同时计算 8 张表。

那么 40 张表总共只需不到 1 小时即可完成。



如果你自己转数据(即,用不到 generate_series 表值函数),可以直接在 Python 里用 sqlite 标准库。开个多进程,刷刷刷~
wxf666
2022-11-01 10:18:38 +08:00
@specter119 请教一下,像 60 楼那样的数据( 2600W 行数据),spark 计算 4 个不同的滑窗,需要多久?总共要多少内存?
zxCoder
2022-11-01 10:56:03 +08:00
(升级 python 版本,听说 3.11 变快了
winglight2016
2022-11-01 11:24:22 +08:00
@mmm159357456 看了#56 的代码,循环都是在构造参数组合吧?直接用 itertools 排列组合一下这几个列表,生成一个 list ,然后用 itertupple 循环会快很多

至于循环里的计算部分,没仔细看,不过一是尽量矢量化操作,二是用并发+lambda 处理,实在还是慢只能 c 或者 rust 了
mmm159357456
2022-11-01 12:24:09 +08:00
@winglight2016 我试试看
@zxCoder 好的
wxf666
2022-11-01 20:29:50 +08:00
@mmm159357456 楼主最后还用了啥方法?大概用时多久?占多少内存?
mmm159357456
2022-11-01 20:54:21 +08:00
@wxf666 😂还没时间调,但是昨天晚上用了下 groupby.transform(rolling),直接卡住
wxf666
2022-11-01 22:26:34 +08:00
@mmm159357456 我好奇问一下,为啥你不愿意放出原始问题呢?

不怕问成 xy problem ,束缚大家的看问题的角度和解决思路么。。

- 比如,有回 换 Python 其他写法、上协程 /多线程 /多进程、升级 Python 、换 C/C++/Rust 提升三次 for 速度的,

- 有剔除重复数据、剪枝来减少 for 数量空间的

- 还有零星几个回复是改变 pandas 运算方法,改变数据存储结构使得能顺序读取的


万一,根本不用三次 for 呢?(比如,如果真的只是计算滑窗数据的话,真的不用三层 for 。另外,个人觉得,既然你用了 pandas ,就该少让 python 掺和进来,多用 pandas 的方法去整体计算 dataframe )

万一,换种数据存储结构,就能高效读取数据和计算呢?(比如,不用随机读,减少 groupby 、sort 、join 了)

万一,有数学大佬能推出个啥神奇公式,能 O(1) 解决问题了呢?😂
mmm159357456
2022-11-02 08:45:46 +08:00
@wxf666 简单点讲就是数据涉密啊,简单描述没什么问题,直接公开那是不能的
wxf666
2022-11-02 09:58:21 +08:00
@mmm159357456 像 #48 楼、#52 、#60 那样,编个数据不就好了。。

只要给出的解决方案也能通用到你原始数据上,目的不就达到了。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/891370

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX