首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python熊猫在垃圾收集上花费了大量的时间

Python熊猫在垃圾收集上花费了大量的时间
EN

Stack Overflow用户
提问于 2018-02-27 06:43:46
回答 1查看 822关注 0票数 1

我正在处理一段复杂的python代码,它花费了大约40%的执行时间在垃圾收集上。

 ncalls    tottime  percall  cumtime  percall filename:lineno(function)

 **6028  494.097    0.082  494.097    0.082** {built-in method gc.collect}

 1900  205.709    0.108  205.709    0.108 {built-in method time.sleep}

  778   26.858    0.035  383.476    0.493 func1.py:51(fill_trades)

有没有办法减少对gc.collect的调用次数?我尝试过gc.disable(),但它的有效性是有限的,因为Cpython大量使用引用计数。我使用的是python 3.6。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-24 03:28:59

我遇到了一个类似的问题,我的代码在垃圾回收中花费了90%的时间。我的函数在测试中每次调用大约需要90ms,但在生产中每次调用接近1s。我追踪到了熊猫,寻找一种安静的SettingWithCopyWarning

在我的例子中,我创建了一个数据帧的切片,比如df = pd.DataFrame(data)[fieldlist],然后分配了一个新的列df['foo'] = ...。在这一点上,df._is_copy显示我们有一个对原始数据帧的弱引用,所以当我们调用__setitem__时,它会测试_check_setitem_copy,然后执行一个完整的垃圾收集周期来杀死弱引用gc.collect(2)

在生产环境中,我的代码每秒尝试调用该函数几次,缓存中有一堆大对象(Dict),因此垃圾收集周期非常昂贵。通过确保我一开始没有创建副本,修复了问题,性能提高了近15倍:-|

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48998314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档