热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何提升Python处理约1GB数据集时的运行效率?

如何提升Python处理约1GB数据集时的运行效率?本文探讨了在后端开发中使用Python处理大规模数据集的优化方法。通过分析常见的性能瓶颈,介绍了多种提高数据处理速度的技术,包括使用高效的数据结构、并行计算、内存管理和代码优化策略。此外,文章还提供了在Ubuntu环境下配置和测试这些优化方案的具体步骤,适用于从事推荐系统等领域的开发者。

后端开发|Python教程用python处理一个1G左右的数据集,运行速度非常慢,怎样优化?
python,delicious,precision,Ubuntu,recall
后端开发-Python教程
研究方向为推荐系统,最近用python在delicious数据集上实现一种简单的基于标签的推荐算法,然后计算recall和precision。在几M的小型数据集上运行时间还可以(十几秒左右),但是在较大(几百兆,1g)的数据集上运行非常慢,我等了4个小时还没有算出结果。请问一下在不对算法进行优化的基础上,采用什么样的方法可以提升程序的运行速度?
实验环境:Ubuntu 13.10, 4G, intel i3-2310M, python 2.75.回复内容:
这里面有两个原因吧:
百度指数 源码,vscode安装包打不开,ubuntu 的login,tomcat安装使用教程,PAGE生成爬虫,php面试题汇总,百度推广软件seo教程,网站蜘蛛记录器lzw
首先, 是算法的问题。复杂度不一样的算法, 在数据规模大的情况下, 运行速度差别会越来越大。你没有描述具体算法, 所以我们也不知道能怎样提升算法。不过根据我的经验, 机器学习算法慢很正常, 因为计算量非常大。很多步骤如果你参照现成一些方法的话, 基本就已经是已知的在算法复杂度和代码复杂度上做了非常好的平衡而且算法复杂度已经很不错的方法。 要想再提高的话要么就要投入大量时间做学术研究,或者大量时间编写复杂的代码。
android访问网络源码,ubuntu中pscp命令,tomcat哪个版本最好用,蚂蚁森林爬虫,php网站电视代码下载,月影seolzw
解决方法是你要自己分析你的程序, 确定每一个部分的复杂度大概是多少,找出算法的瓶颈, 然后花精力优化瓶颈上的算法。
android程序锁源码,vscode编译成功,ubuntu装monkey,tomcat设置堆栈内存,爬虫壁纸代码,php怎么学会,百度seo推广长沙,个人流量网站源码,wordpree修改模板代码lzw
第二个问题是众所周知的 python 本身速度慢的问题,python作为完全建立在解释器上的支持OO支持FP且类型dynamic的语言, 能使用的机器指令优化非常有限,一般认为比native程序慢10-100倍是正常的。

解决方法:一个快速的 work-around 是使用 JIT 编译器例如 PyPy, 速度可以提高大概几倍到10倍左右。 另外,使用一个 profile 技术找到运行时间的瓶颈, 可以把瓶颈部分用 C 重写,即可几乎达到native速度。

最后, 在这个多核和云时代, 你应该考虑多核甚至多机器了。 Python 本身又 GIL, 一个进程内不支持计算意义上的多线程, 把你的程序各个部件好好划分一下, 分解成多进程。 然后用一台机器的多个CPU同时跑, 或者仍给多台机器跑。

题主,让我来给你一些实用建议吧!
考虑拿C或C++重写.考虑并行搞,找个hadoop集群,写成mapreduce程序跑 放在hadoop上跑,更多数据都不怕.考虑升级机器,多搞点内存,然后东西尽量放在内存里搞.考虑程序优化.你得看看你程序慢在什么地方,可以按照以下步骤:首先,确信你真的需要把全部数据过一遍,如果可以通过一些糙快猛方式过滤掉无用数据,这样最好了. (比如有些明显无用的东西可以直接通过grep过滤掉,grep这种程序写的一般比你写的python程序要快好多好多好多好多)top一下,看CPU跑满了吗?单线程单进程实现?你能不能搞成多进程的?然后top看每个核都跑满了吗?没跑满的话,那你你要努力充分利用你的CPU,要让CPU跑满!看看程序,没跑满是因为IO吗?是的话IO能搞成异步的么?或IO次数太多?能不能减少IO次数?甚至只搞一次IO,比如你那1G的东西,能不能一次全搞到内存里,然后所有东西在内存里处理(这样的话貌似写成C的更方便一点)如果每个核心都跑满了,那就看看你的计算都花在什么地方,可以用hotshot等工具测一把. 可以粗略比较一下在 1/16 数据、1/8数据、1/4数据、1/2数据的情况下,hotshot的结果,看你的函数花的时间是怎么涨的.找出花时间最多的一个或几个东西(所谓瓶颈),有针对性的优化,可以事半功倍.找到问题所在之后,寻求解决方案. 如果是python带的数据结构不不合适,能不能用numpy之类的东西解决,能不能用一些数据库解决(比如需要多个进程一起往一个大字典里写,可以考虑全往一个redis里写).能不能有的地方用cython包装一个C实现. 如果是算法不够好,能不能优化算法. (这就说来话长了)试试一些奇怪的东西,比如PyPy.
单机情况下,总结起来,就是:首先减少输入数据,然后不要浪费机器资源,要让所有CPU核心跑满(多进程 & 减少/不等待IO),内存只要还够用的话,就可劲用!然后找程序最慢的地方,针对其做各种优化.

如果有多机,弄到hadoop里搞,数据再多也不怕不怕啦!

用delicious数据集即使是最naive的count(u,t)*(t,i)顺加inverse frequency都很慢吧。。。毕竟tag 和item都太多了。。。慢是正常的。。。

首先你应该确认一下你的算法复杂度,比如数据翻倍后运行时间增加多少?

正好看到这个 numfocus/python-benchmarks 路 GitHub

profile + cython

一般来说最省力且最容易大幅度提升的反而是优化算法/使用profile优化实现。
其次是使用pypy/cython。
再其次使用numpy。
最后是改用其他语言。

python 数组遍历特别慢,可以结合 cython加速

i3-2310M?实验环境居然是在入门级笔记本上,你们实验室(公司)到底是有多困难?

numpy是比较慢,矩阵运算量大可以试一下Matlab。另外可以profile一下你的程序,看看哪个环节运算时间比较长。


推荐阅读
author-avatar
鱼mm不会游泳456
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有