Pandas 的性能问题

2021-01-08 18:30:55 +08:00
 shuangchengsun
DataFrame 的 append 操作每次都会返回一个全新的对象,势必会有大量的内存拷贝,这样岂不是会严重拉胯新能,还是说有新的姿势构造 DataFrame 。小白跪求大佬赐教。
4706 次点击
所在节点    Python
22 条回复
lewinlan
2021-01-08 18:46:46 +08:00
我记得有一个参数,可以指定原地操作。
wuwukai007
2021-01-08 19:18:24 +08:00
concat
bilibilifi
2021-01-08 19:25:11 +08:00
list 里搞好了再转?我记得 dataframe 为了优化性能会把数据放在连续的内存里
nthhdy
2021-01-08 22:04:33 +08:00
我不了解啊,瞎说的。但我感觉它不会拷贝内存的,有可能是写时复制的。可以读下源码看看。
crystom
2021-01-08 22:10:02 +08:00
懒操作吧
allAboutDbmss
2021-01-08 22:18:30 +08:00
milkpuff
2021-01-09 02:02:19 +08:00
pandas 直接操作非常慢,一般拼接都 append 到 list 里面,最后一次性 concat 。
pandas 索引、切片、拼接、赋值等都不适合频繁调用,转换成 numpy 效率可以极大提升
Rorysky
2021-01-09 02:07:44 +08:00
猛男都直接用原生数据类型
qile1
2021-01-09 03:01:39 +08:00
@milkpuff 多谢回复,我都是 for 遍历逐行附值到 pandas 里面,后期得修改下
lixuda
2021-01-09 07:58:17 +08:00
@qile1 apply 方式
myCupOfTea
2021-01-09 08:46:55 +08:00
数据量太大确实会有性能问题啊
底层是 numpy 吧,numpy concat 数据量大的阵列确实会很慢
lithiumii
2021-01-09 09:50:21 +08:00
append 确实慢
如果是一堆小 df 建议 concat 一个 list
如果是一行一行的可以每行先存成一个 dict 然后 append 到 list 里,最后转成 df
shuangchengsun
2021-01-09 10:40:49 +08:00
@bilibilifi 我现在的数据阵列是 rows 是一亿五千万左右,columns 是 12,有点太庞大了,用 list 的话能撑住么?
shuangchengsun
2021-01-09 10:41:19 +08:00
@allAboutDbmss 谢谢推荐,我去看看这个工具
shuangchengsun
2021-01-09 10:43:19 +08:00
@myCupOfTea 数据量确实很大,rows 差不多一亿五千万的样子。
shuangchengsun
2021-01-09 10:43:44 +08:00
@lithiumii 感谢指导,我这就去试试。
outoftimeerror
2021-01-09 14:18:56 +08:00
用 spark dataframe
volvo007
2021-01-09 16:14:24 +08:00
@shuangchengsun list 存的是对象指针,不是实际的对象……

对于这个体量的数据,可以考虑用 vaex 这个库

如果上下文操作不复杂且需要持久化的话,强烈安利 PostgreSQL 数据库来处理,超好用,真香
weeevv
2021-01-09 16:20:41 +08:00
Dask 或者直接上数据库吧。
dlsflh
2021-01-09 16:54:57 +08:00
试试看并行的 pandas modin ?

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

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

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

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

© 2021 V2EX