编写高效的R代码
编写高效的代码是非常重要的,因为它使开发时间更快,并使我们的程序能够容易理解、调试和维护。我们将讨论各种技术,如基准测试、矢量化和并行编程,使我们的R代码更快。如果你有志于成为一名数据科学家,你必须学习这些技术。那么,让我们开始吧 –
基准测试
最简单的优化之一是拥有最新的R版本来工作。新版本不能修改我们现有的代码,但它总是带有强大的库函数,提供改进的执行时间。
在R中的以下命令显示了R的版本信息列表 —
输出
读取CSV文件作为RDS文件
使用read.csv()加载文件需要大量的时间。高效的处理方法是先读取并保存.rds格式的.csv文件,然后再读取二进制文件。R为我们提供了saveRDS()函数以.rds格式的.csv文件。
示例
输出
注意这两种方法的执行时间的区别。读取相同的.RDS格式的文件所需的时间几乎可以忽略不计。因此,读取RDS文件比读取CSV文件更有效率。
使用”<-“和”=”运算符进行赋值
R为我们提供了几种将变量和文件分配给对象的方法。有两个运算符被广泛用于此目的:”<-“和”=”。值得注意的是,当我们在一个函数中使用”<-“运算符时,它要么创建一个新的对象,要么覆盖现有的对象。由于我们要存储结果,在system.time()函数中使用”<-“运算符是很有用的。
耗时的微观基准测试功能
system.time()函数对于计算某些操作所花费的时间是可靠的,但它有一个限制,即不能同时比较许多操作。
R为我们提供了一个微基准库,它为我们提供了一个microbenchmark()函数,我们可以用它来比较两个函数或操作所花费的时间。
示例
考虑以下程序,它使用microbenchmark()函数来比较以两种不同格式存在的相同文件。CSV和RDS
输出
注意这两种方法的执行时间的差异。
高效的矢量化
在编程中,矢量的大小随着代码的流动而增加是不可取的,应该尽可能地避免。这是因为它消耗了大量的时间,使我们的程序效率低下。
示例
例如,下面的源代码增加了向量的大小—-。
输出
正如你在输出中看到的,expand()函数消耗了大量时间。
示例
我们可以通过预分配向量来优化上述代码。例如,考虑下面的程序-
输出
正如你在输出中所看到的,执行时间已经大幅减少。
我们应该尽可能地将我们的代码矢量化。
示例
输出
输出表示对应的向量值与自身之和。
示例
下面做的事情和上面做的一样,但这次我们将使用矢量化方法,这将减少我们的代码大小并增加执行时间。
输出
输出表示对应的向量值与自身的总和,但这一次我们使用了向量的方法。
请注意,我们甚至可以用R的内置函数来应用矢量化技术。
示例
输出
正如你在输出中看到的,相应的向量值的对数已经显示出来了。
示例
现在让我们尝试实现同样的事情,但这次使用的是矢量化技术
输出
正如你在输出中看到的,相应的向量值的对数已经显示出来了,但这次我们使用了向量的方法。
示例
与数据框架相比,包含相同数据类型的元素的矩阵具有更快的列访问。例如,考虑下面的程序-
输出
你可以发现矩阵和数据框架的列访问方法的执行时间的差异。
高效R代码的并行编程
R为我们提供了一个并行包,我们可以用它来编写高效的R代码。并行主义在大多数情况下有利于在更短的时间内完成事情,并适当地利用系统资源。R中的并行包为我们提供了parApply()函数,该函数使用以下步骤来并行运行一个程序
- 使用makeCluster()函数制作一个集群。
-
写一些声明。
-
最终,使用stopCluster()函数停止集群。
示例
下面的源代码使用R中的parApply()函数计算所有列的平均值 –
输出
正如你在输出中所看到的,相应列的平均数是用并行编程计算出来的,速度更快。
结论
在这篇文章中,我们简要地讨论了如何在R中编写高效的代码。我们讨论了基准测试、不同的矢量技术和并行编程。我希望这个教程肯定能帮助你扩展你在数据科学领域的知识。