原文标题:Why you should forget ‘for-loop’ for data science code and embrace vectorization

作者:Tirthajyoti Sarkar

翻译:杨金鸿

校对:丁楠雅

本文长度为1986字,建议阅读5分钟

数据科学需要快速计算和数据转换的能力。Python中的NumPy对象提供了优于常规编程结构算法,比如for循环。如何用简单的代码来演示它呢?

在11月27日至12月3日的KDnugget网站上,这篇文章被转载最多(https://www.kdnuggets.com/2017/12/top-news-week-1127-1203.html)。

我们使用for循环来完成大部分工作,这些工作需要对一长串的元素进行更新。我敢断言,几乎所有人阅读这篇文章的读者,在他们高中或大学里都里有肯定有使用过for循环语句编写自己的第一个矩阵或矢量乘法代码。for循环为编程社区提供了长期稳定的服务。

然而,for循环在处理大型数据集时执行速度通常较慢(例如:在大数据时代处理几百万条记录)。对于像Python这样的解释性语言来说尤其如此。如果您的循环体很简单,那么循环解释器会占用大量的开销。

幸运的是,大部分主流的编程语言都有另外一种编程语言可以取代它。Python也是如此。

Numpy是Numerical Python(http://numpy.org/)的简称,同时也是Python生态系统中高性能科学计算和数据分析所需要的基本包。它几乎是所有高级语言工具的基础,如Pandas和 scikit-learn都是在Numpy的基础上编译的。TensorFlow使用NumPy阵列作为底层编译块。在这之上构建了Tensor对象和用于深度学习的graphflow(使用了大量的线性代数运算在一个长的列表/矢量/矩阵)。

Numpy提供的两个最重要的特性是:

  • Ndarray:一个快速空间高效的多维数组,提供了矢量化计算操作和复杂的广播能力(https://towardsdatascience.com/two-cool-features-of-python-numpy-mutating-by-slicing-and-broadcasting-3b0b86e8b4c7)

  • 标准的数学函数,可以在不写循环的情况下,对整个数据数组进行快速操作。

在数据科学、机器学习和Python社区中,您经常会遇到这样的断言:Numpy是更速度的。因为它是基于矢量的实现,而且它的许多核心例程都是用C语言编写(基于CPython 框架:https://en.wikipedia.org/wiki/CPython)。

这篇文章是一个CPython 框架的很好阐述(http://notes-on-cython.readthedocs.io/en/latest/std_dev.html)Numpy可以与各个方面协同工作。甚至可以使用Numpy api编写裸机骨C例程。Numpy阵列是均匀类型的密集阵列。相反,Python列表是指向对象的指针数组,即使它们是相同的对象类型。你可以从区域性关联(https://en.wikipedia.org/wiki/Locality_of_reference)得到收获。

许多Numpy操作是用C语言实现的,避免了Python中循环的开销、指针指向每个元素的动态类型检查(https://www.sitepoint.com/typing-versus-dynamic-typing/)。Numpy速度的提升取决于你所执行的操作。对于数据科学和现代机器学习来说,这是一个非常宝贵的优势,因为通常数据集的大小会达到数百万甚至数十亿。并且您不希望使用For循环和它的相关的算法进行更新。

如何用一个中等大小的数据集来验证它呢?

这里是Jupyter Github代码链接(https://github.com/tirthajyoti/PythonMachineLearning/blob/master/How%20fast%20are%20NumPy%20ops.ipynb)。其中在一些简单的代码行中,Numpy的操作速度与常规Python编程的速度不同,比如for循环、map-function(https://stackoverflow.com/questions/10973766/understanding-the-map-function)或list-comprehension(http://www.pythonforbeginners.com/basics/list-comprehensions-in-python)。

这里我简单的概括下基本流程:

  • 创建一个中等数量集的浮点数列表,最好是从连续的统计分布中抽取出来,比如高斯分布或均匀随机分布。为了演示我选择了100万条数据

  • 在列表中创建一个ndarray对象,也就是矢量化

  • 编写简短的代码块来更新列表,并在列表上使用数学运算,比如以10为底的对数。使用for循环、map-function和list-comprehension。并使用time()函数来核实处理100万条数据需要花费多长时间

t1=time.time()

for item in l1:

l2.append(lg10(item))

t2 = time.time()

print("With for loop and appending it took {} seconds".format(t2-t1))

speed.append(t2-t1)

  • 用Numpy的内置数学方法(np.log10)在ndarray对象上做同样的操作。计算出花费了多长时间

t1=time.time()

a2=np.log10(a1)

t2 = time.time()

print("With direct Numpy log10 method it took {} seconds".format(t2-t1))

speed.append(t2-t1)

  • 在一个列表中存储执行时间,并绘制出一个差异的柱状图

下面是结果显示。你可以运行Jupyter笔记本上的所有代码单元块来重复整个过程。每次它会生成一组新的随机数,因此精准的执行时间可能会有所不同。但总体来说,趋势始终是相同的。您可以尝试使用各种其他的数学函数/字符串操作或者集合,来检查是否适用于一般情况。

这里有一个由法国神经科学研究员编写的完整开源在线书籍(https://www.labri.fr/perso/nrougier/from-python-to-numpy/#id7)。

简单数学运算比较速度的柱状图

如果你有任何问题或想法要分享,请与作者联系(tirthajyoti@gmail.com)。您也可以在Python、R或MATLAB和机器学习资源中查看作者的GitHub库(https://github.com/tirthajyoti),获得其他有趣的代码片段。你也可以在LinkedIn(https://www.linkedin.com/in/tirthajyoti-sarkar-2127aa7/)上关注我。

原文链接:

https://towardsdatascience.com/why-you-should-forget-for-loop-for-data-science-code-and-embrace-vectorization-696632622d5f


杨金鸿,北京护航科技有限公司员工,在业余时间喜欢翻译一些技术文档。喜欢阅读有关数据挖掘、数据库之类的书,学习java语言编程等,希望能在数据派平台上熟识更多爱好相同的伙伴,今后能在数据科学的道路上走的更远,飞的更远。

翻译组招募信息

工作内容:将选取好的外文前沿文章准确地翻译成流畅的中文。如果你是数据科学/统计学/计算机专业的留学生,或在海外从事相关工作,或对自己外语水平有信心的朋友,数据派翻译组欢迎你们加入!

你能得到:提高对于数据科学前沿的认知,提高对外文新闻来源渠道的认知,海外的朋友可以和国内技术应用发展保持联系,数据派团队产学研的背景为志愿者带来好的发展机遇。

其他福利:和来自于名企的数据科学工作者,北大清华以及海外等名校学生共同合作、交流。

点击文末“阅读原文”加入数据派团队~

转载须知

如需转载,请在开篇显著位置注明作者和出处(转自:数据派THUID:DatapiTHU),并在文章结尾放置数据派醒目二维码。有原创标识文章,请发送【文章名称-待授权公众号名称及ID】至联系邮箱,申请白名单授权并按要求编辑。

发布后请将链接反馈至联系邮箱(见下方)。未经许可的转载以及改编者,我们将依法追究其法律责任。


点击“阅读原文”加入组织~

放弃“for循环”,教你用这种算法 !(附代码)相关推荐

  1. 智能优化算法:正余弦优化算法-附代码

    智能优化算法:正余弦优化算法-附代码 文章目录 智能优化算法:正余弦优化算法-附代码 1.算法原理 2.算法流程 3.算法结果 4.参考文献 5.MATLAB代码 6.Python代码 摘要:正 余 ...

  2. 智能优化算法:帝国主义竞争算法-附代码

    智能优化算法:帝国主义竞争算法-附代码 文章目录 智能优化算法:帝国主义竞争算法-附代码 1.算法原理 1.1 帝国集团的初始化 1.2 帝国集团内部调整 1.3 交换帝国和殖民地的位置 1.4 帝国 ...

  3. 基于蜣螂算法改进的随机森林回归算法 - 附代码

    基于蜣螂算法改进的随机森林回归算法 - 附代码 文章目录 基于蜣螂算法改进的随机森林回归算法 - 附代码 1.数据集 2.RF模型 3.基于蜣螂算法优化的RF 4.测试结果 5.Matlab代码 6. ...

  4. 路径规划算法:基于樽海鞘算法的路径规划算法- 附代码

    路径规划算法:基于樽海鞘优化的路径规划算法- 附代码 文章目录 路径规划算法:基于樽海鞘优化的路径规划算法- 附代码 1.算法原理 1.1 环境设定 1.2 约束条件 1.3 适应度函数 2.算法结果 ...

  5. 路径规划算法:基于灰狼优化(GWO)的路径规划算法- 附代码

    路径规划算法:基于灰狼优化(GWO)的路径规划算法- 附代码 文章目录 路径规划算法:基于灰狼优化(GWO)的路径规划算法- 附代码 1.算法原理 1.1 环境设定 1.2 约束条件 1.3 适应度函 ...

  6. 路径规划算法:基于蜻蜓算法的路径规划算法- 附代码

    路径规划算法:基于蜻蜓优化的路径规划算法- 附代码 文章目录 路径规划算法:基于蜻蜓优化的路径规划算法- 附代码 1.算法原理 1.1 环境设定 1.2 约束条件 1.3 适应度函数 2.算法结果 3 ...

  7. 路径规划算法:基于鸟群优化的路径规划算法- 附代码

    路径规划算法:基于鸟群优化的路径规划算法- 附代码 文章目录 路径规划算法:基于鸟群优化的路径规划算法- 附代码 1.算法原理 1.1 环境设定 1.2 约束条件 1.3 适应度函数 2.算法结果 3 ...

  8. 智能优化算法:多元宇宙优化算法-附代码

    智能优化算法:多元宇宙优化算法-附代码 文章目录 智能优化算法:多元宇宙优化算法-附代码 1.算法原理 2.算法流程图 3.算法结果 4.参考文献 5.MATLAB代码 6.python代码 摘要:多 ...

  9. 智能优化算法:蚁狮优化算法-附代码

    智能优化算法:蚁狮优化算法-附代码 文章目录 智能优化算法:蚁狮优化算法-附代码 1.算法原理 1.1 蚂蚁的随机游走 1.2蚁狮对蚂蚁随机游走的影响 1.3自适应机制 1.4 精英策略 2.算法步骤 ...

  10. 路径规划算法:基于飞蛾扑火算法的路径规划算法- 附代码

    路径规划算法:基于飞蛾扑火优化的路径规划算法- 附代码 文章目录 路径规划算法:基于飞蛾扑火优化的路径规划算法- 附代码 1.算法原理 1.1 环境设定 1.2 约束条件 1.3 适应度函数 2.算法 ...

最新文章

  1. 使用VS Code开发.Net Core 2.0 MVC Web应用程序教程之三(配置文件读取)
  2. 百度大脑发布企业服务解决方案,将 AI 技术落实到细分领域
  3. mysql test 映射到实体_将MySql视图映射到JPA Entitites,使用哪个唯一...
  4. 牛客网——华为机试(题8:合并表记录)(Java)
  5. 如何设计好分布式数据库,这个策略很重要
  6. LeetCode-66. 托普利茨矩阵
  7. Windows学习总结(14)——最常用的Windows快捷键再总结
  8. [转载] URL短网址生成算法原理
  9. python与c 交互原理_PYTHON 与C相互交互调用实例解析
  10. SchoolTool:先进的学院管理和信息系统
  11. linux下iconv命令转换字符编码
  12. 水水水水水水水水水水水水水水水水水水水
  13. C语言 线程的回收与子线程返回值的接收
  14. 【黑马程序员西安中心】我和传智有个梦!
  15. 5G NR 随机接入RACH流程(7)--分类和重要RACH流程总结
  16. 软件开发相关面经6——数据库篇
  17. java se项目实战视频_项目整体测试_09-JAVASE项目实战-电影管理系统_Java视频-51CTO学院...
  18. pptp-client连接设置
  19. Le vent se lève, il faut tenter de vivre
  20. https证书价格多少?会影响价格的因素

热门文章

  1. HTTP与服务器的四种交互方式
  2. sqlite3常用命令以及django如何操作sqlite3数据库
  3. 关于Datastage资料库的一点小发现
  4. 怎么样在c#程序中放音乐
  5. html实现以秒为单位倒数,跳转新的页面
  6. pmp项目变更的流程图_?跟我学PMP | 项目的变更管理应该怎么做?
  7. 退出oracle系统,配置Oracle随系统启动和关闭
  8. 科学成为时尚的可行办法
  9. RuntimeError: output with shape [1, 28, 28] doesnt match the broadcast shape [3, 28, 28]
  10. matlab最大化函数,求助,最大化一个函数