热门标签 | 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一下你的程序,看看哪个环节运算时间比较长。


推荐阅读
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 当在 Android 应用中使用 NDK 时,可能会遇到 java.lang.UnsatisfiedLinkError: Native method not found 的错误。本文将详细探讨该错误的原因及解决方案。 ... [详细]
  • 并发编程:深入理解设计原理与优化
    本文探讨了并发编程中的关键设计原则,特别是Java内存模型(JMM)的happens-before规则及其对多线程编程的影响。文章详细介绍了DCL双重检查锁定模式的问题及解决方案,并总结了不同处理器和内存模型之间的关系,旨在为程序员提供更深入的理解和最佳实践。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 本文总结了在使用Ionic 5进行Android平台APK打包时遇到的问题,特别是针对QRScanner插件的改造。通过详细分析和提供具体的解决方法,帮助开发者顺利打包并优化应用性能。 ... [详细]
  • 理解存储器的层次结构有助于程序员优化程序性能,通过合理安排数据在不同层级的存储位置,提升CPU的数据访问速度。本文详细探讨了静态随机访问存储器(SRAM)和动态随机访问存储器(DRAM)的工作原理及其应用场景,并介绍了存储器模块中的数据存取过程及局部性原理。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 解决微信电脑版无法刷朋友圈问题:使用安卓远程投屏方案
    在工作期间想要浏览微信和朋友圈却不太方便?虽然微信电脑版目前不支持直接刷朋友圈,但通过远程投屏技术,可以轻松实现在电脑上操作安卓设备的功能。 ... [详细]
  • 本文深入探讨了 Java 编程语言的基础,特别是其跨平台特性和 JVM 的工作原理。通过介绍 Java 的发展历史和生态系统,帮助初学者理解如何编写并运行第一个 Java 程序。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 本文详细介绍了如何准备和安装 Eclipse 开发环境及其相关插件,包括 JDK、Tomcat、Struts 等组件的安装步骤及配置方法。 ... [详细]
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社区 版权所有