Erlang中删除列表元素在标准模块lists中可以找到delete/2函数,
比如调用lists:delete(2, [1,2,3,4,5])后将返回新的列表[1,3,4,5]
笔者在翻阅lists模块源码中发现,一些函数实现成BIF,比如reverse就是一个BIF,在注释中发现
%% reverse(L) reverse all elements in the list L. Is now a BIF!
由此确定reverse是一个BIF。
但对delete函数的实现没找到类似的注释,怀疑其不是一个BIF,其实现存在性能问题,其实现代码如下:
delete(Item, [Item|Rest]) -> Rest;
delete(Item, [H|Rest]) ->
[H|delete(Item, Rest)];
delete(_, []) -> [].
这个实现没使用尾递归,对大表的操作将会导致堆栈上的内存消耗严重。
测试程序如下:
test1() ->
{ok,Bin} = file:read_file("file1.txt"),
L = binary_to_list(Bin),
R = lists:delete($a,L),
io:format("~p~n",[length(R)]).
文件file1.txt有近30M大小,运行时内存高值1G以上。
笔者对delete重新用尾递归的方式改写一遍:
delete(E, [E|T], R) -> lists:reverse(R) ++ T;
delete(E, [H|T], R) -> delete(E, T, [H|R]);
delete(E, [], R) -> lists:reverse(R).
再运行测试程序:
test2() ->
{ok,Bin} = file:read_file("file1.txt"),
L = binary_to_list(Bin),
R = delete($a,L,[]),
io:format("~p~n",[length(R)]).
发现内存占用在800M以内。
由此可以推测标准模块中lists的delete函数存在性能优化的空间,其他函数可能也同样存在这个问题,这对小列表不存在什么问题,
对大列表的处理如果内存足够也没什么问题,但总会让人觉得不爽。同时也说明编写尾递归函数的重要性,如果是自定义函数,写成尾递归的形式总是对的。
分享到:
相关推荐
本教程将深入探讨Swift中的一个高级特性——嵌套函数,它是将函数定义在另一个函数内部的一种方法,有助于组织代码并提高代码的模块化。 嵌套函数的概念允许我们创建私有的辅助函数,这些函数仅在包含它们的外部...
08_delete_lists
2. **内部函数引用了外部函数的变量(自由变量)**:这里的“自由变量”是指那些在内部函数中被引用但在内部函数定义范围外声明的变量。 3. **外部函数会把内部函数的函数名称返回**:这是为了能够在外部作用域中调用...
4. **高阶函数**:Lisp包含许多高阶函数,如`mapcar`对列表中的每个元素应用函数并返回新列表,`reduce`将列表中的元素聚合为单一值,`funcall`允许动态调用函数。 5. **宏**:Lisp的宏系统允许程序员定义自己的...
【函数式编程基础概念】 函数式编程是一种编程范式,起源于50多年前,近年来由于其在特定...在Java等面向对象语言中,利用Lambda表达式和函数接口,开发者可以灵活地引入函数式编程的元素,以适应不同类型的项目需求。
Lists-Lists-Lists
列表在Haskell中具有特殊地位,因为它们是函数式编程中常用的数据结构,支持高阶函数。 3. **4.Programmingwithlists.ppt - 使用列表编程** 这部分深入讲解了对列表的操作,包括map、filter、foldl/foldr等高阶...
`web_url`函数是LoadRunner中用于模拟用户访问网页的核心函数,其基本语法如下: ```c Int Web_url(const char *name, const char *url, <Lists of Attributes>, [EXTRARES,<Lists of Resource Attributes>,LAST) `...
### C-C++中的System函数详解 #### 一、概述 `system`函数是C和C++编程语言中用于执行外部程序或系统命令的一个强大工具。它允许开发人员直接从程序内部调用各种操作系统命令,例如清理屏幕、查看目录内容等。通过...
因此,"LoadRunner函数中文翻译"资料就显得尤为关键,它提供了LR中各种函数的中文解释,帮助用户更好地理解和使用这些函数。 1. **Web_url函数** - **语法**:`Int Web_url(const char *name, const char * url, ...
在IT行业中,函数式编程是一种重要的编程范式,它强调将计算视为数学函数的应用,并避免了可变状态和副作用。Java 8引入了对函数式编程的支持,使得开发者可以利用这种编程风格来编写更加简洁、易读且易于测试的代码...
在Python编程语言中,内置函数是预定义的、可以直接使用的函数,无需额外导入任何模块。这些函数极大地提高了我们的编程效率,使我们能够快速地处理数据和执行常见的编程任务。本篇将详细介绍`Python内置函数示例(3...
注意:在纯功能设置中处理不可变数据列表时,此模块是对Data.Array的改进,但没有良好的随机访问性能。 安装 spago install lists 发牌 其中一些代码是从GHC的标准库( base )派生的; 根据其条款,我们已经在文件...
proxy-lists 一个Node.js模块,用于从公开可用的代理列表中获取代理
理工科必备的Journal Term Lists,使用EndNote导入,可以使得插入参考文献时更加的准确。。。
Lists.pas 提供了很多个TList的扩展类,是学习很研究TList的好东西。 Calendar.pas 公历与农历换算和时间处理的函数单元,具体看里面的说明。 Clipboards.pas 提供一个剪贴板增强类,可支持保存和载入剪贴板,...
【LoadRunner函数中文翻译系列之一--Action】这篇内容主要讲解了LoadRunner中两种重要的函数:web_url和web_image,它们是LoadRunner进行性能测试时用于模拟用户行为的关键组成部分。 1. **web_url函数**: - `web...