[ Skill ] append1, append, nconc, tconc, lconc, cons 效率对比
https://www.cnblogs.com/yeungchie/
先说结论:cons > tconc, lconc >> nconc > append1, append
append1
let((a)
ycTime(
for(i 1 fix(3e4)
a = append1(a i)
)
)
length(a)
)
; UserTime : 12.108453s
; SysTime : 0.000000s
; WallClock : 12.104178s
; 30000
append
let((a)
ycTime(
for(i 1 fix(3e4)
a = append(a list(i))
)
)
length(a)
)
; UserTime : 13.654966s
; SysTime : 0.000000s
; WallClock : 13.651223s
; 30000
append1, append这两个函数操作写链表速度奇慢,因为它每次追加元素都需要把整个链表遍历一次。
唯一的好处就是对初学者友好,容易理解和使用,因此在知道数据量不大的前提下,才去使用这两个函数吧。
nconc
let((a)
ycTime(
for(i 1 fix(3e4)
a = nconc(a list(i))
)
)
length(a)
)
; UserTime : 2.995670s
; SysTime : 0.000000s
; WallClock : 2.994434s
; 30000
相比
append快了一点,但也没有快很多,毕竟只追加 30000 次。
它对于输入变量是具有破坏性的,会直接修改变量,而不像append在底层会将数据进行拷贝,因此会快一些,更省内存。
tconc
let((a)
ycTime(
for(i 1 fix(3e4)
a = tconc(a i)
)
a = car(a)
)
length(a)
)
; UserTime : 0.001871s
; SysTime : 0.000000s
; WallClock : 0.001871s
; 30000
tconc会保留链表中最后一个节点,当追加列表时直接操作该节点,因此不需要反复遍历整个链表。car指向我们期望的链表。
在上面的情况下,相比append快了近 5000 倍,已经没有可比性了,所以后面函数把追加次数调整为 60000000 来比较。
let((a)
ycTime(
for(i 1 fix(6e7)
a = tconc(a i)
)
a = car(a)
)
length(a)
)
; UserTime : 4.085272s
; SysTime : 0.000189s
; WallClock : 4.083197s
; 60000000
lconc
let((a)
ycTime(
for(i 1 fix(6e7)
a = lconc(a list(i))
)
a = car(a)
)
length(a)
)
; UserTime : 4.741206s
; SysTime : 0.000000s
; WallClock : 4.740194s
; 60000000
两者区别在于,
tconc拼接的是一个标量,lconc拼接的是一个链表。
速度相差不大,看情况来使用吧。
cons
let((a)
ycTime(
for(i 1 fix(6e7)
a = cons(i a)
)
)
length(a)
)
; UserTime : 1.865164s
; SysTime : 0.000000s
; WallClock : 1.865343s
; 60000000
这个函数又快不少,它是将元素追加到链表开头,因此不需要遍历元素,也不需要记忆节点。
由于是向前追加,元素顺序可能会跟我们期望的相反,这时候就需要降链表翻转一下,看看速度。
let((a)
ycTime(
for(i 1 fix(6e7)
a = cons(i a)
)
a = reverse(a)
)
length(a)
)
; UserTime : 3.655040s
; SysTime : 0.000000s
; WallClock : 3.649090s
; 60000000
翻转增加了一点耗时,速度跟
tconc和lconc差不多。
[ Skill ] append1, append, nconc, tconc, lconc, cons 效率对比的更多相关文章
- python中列表的insert和append的效率对比
python中insert和append方法都可以向列表中插入数据只不过append默认插入列表的末尾,insert可以指定位置插入元素. 我们来测试一下他俩插入数据的效率: 测试同时对一个列表进行插 ...
- Snapman系统中TCC执行效率和C#执行效率对比
Snapman集合了TCC编译器可以直接编译执行C语言脚本,其脚本执行效率和C#编译程序进行效率对比,包括下面4方面: 1.函数执行效率 2.数字转换成字符串 3.字符串的叠加 4.MD5算法 这是C ...
- 进程and线程and协程效率对比
1.进程与进程池的效率对比 多进程:p.start()过程中,只是向操作系统发送一个信号,至于什么时候执行,都是操作系统的事情,操作系统接收到信号时,帮该进程申请一块内存空间+拷贝父进程的地址空间 # ...
- string中Insert与Format效率对比、String与List中Contains与IndexOf的效率对比
关于string的效率,众所周知的恐怕是“+”和StringBuilder了,这些本文就不在赘述了.关于本文,请先回答以下问题(假设都是基于多次循环反复调用的情况下):1.使用Insert与Forma ...
- FileInputStream 与 BufferedInputStream 效率对比
我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3550158.html ,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体 ...
- java中多种写文件方式的效率对比实验
一.实验背景 最近在考虑一个问题:“如果快速地向文件中写入数据”,java提供了多种文件写入的方式,效率上各有异同,基本上可以分为如下三大类:字节流输出.字符流输出.内存文件映射输出.前两种又可以分为 ...
- golang 浮点数 取精度的效率对比
需求 浮点数取2位精度输出 实现 代码 package main import ( "time" "log" "strconv" " ...
- SIMD---SSE系列及效率对比
SSE(即Streaming SIMD Extension),是对由MMX指令集引进的SIMD模型的扩展.我们知道MMX有两个明显的缺点: 只能操作整数. 不能与浮点数同时运行(MMX使用FPU寄存器 ...
- 查询最新记录的sql语句效率对比
在工作中,我们经常需要检索出最新条数据,能够实现该功能的sql语句很多,下面列举三个进行效率对比 本次实验的数据表中有55万条数据,以myql为例: 方式1: SELECT * FROM t_devi ...
- c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习
c#中@标志的作用 参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...
随机推荐
- L1-018 大笨钟 (10分)
开始天梯赛专项训练 微博上有个自称"大笨钟V"的家伙,每天敲钟催促码农们爱惜身体早点睡觉.不过由于笨钟自己作息也不是很规律,所以敲钟并不定时.一般敲钟的点数是根据敲钟时间而定的,如 ...
- Manjaro 上手使用简明教程
Manjaro 是一个非常好用的系统,在被很多朋友介绍过很多次以后,我终于试着开始使用这个系统了,今天就简单记录一下,方便从别的系统来的移民,尤其是听说过 Arch 大名,也曾向往之,然而因为它的安装 ...
- JVM 内存大对象监控和优化实践
作者:vivo 互联网服务器团队 - Liu Zhen.Ye Wenhao 服务器内存问题是影响应用程序性能和稳定性的重要因素之一,需要及时排查和优化.本文介绍了某核心服务内存问题排查与解决过程.首先 ...
- 师爷,翻译翻译什么叫AOP
张麻子:汤师爷,翻译翻译,什么叫AOP? 汤师爷:这还用翻译. 张麻子:我让你翻译给我听,什么叫AOP? 汤师爷:不用翻译,切面编程就是AOP啊. 黄四郎:难道你听不懂什么叫AOP? 张麻子:我就想让 ...
- vue tabBar导航栏设计实现3-进一步抽取tab-item
系列导航 一.vue tabBar导航栏设计实现1-初步设计 二.vue tabBar导航栏设计实现2-抽取tab-bar 三.vue tabBar导航栏设计实现3-进一步抽取tab-item 四.v ...
- 机器学习-决策树系列-GBDT算法-集成学习-30
目录 1. 复习 2. GBDT 3. gbdt应用于二分类: 3. gbdt应用于多类 4. 叶子节点输出值c的计算 5. GBDT的其他应用 6. GBDT+LR 代码实现 1. 复习 再开始学习 ...
- Nacos源码 (7) Nacos与Spring
SpringCloud工程可以使用Nacos作为注册中心和配置中心,配置和使用非常简单,本文将简单介绍使用方式,并分析其实现方式. SpringCloud工程集成Nacos SpringCloud工程 ...
- 02-python简介
python简介 python认知 1.python简介 89年开发的语言,创始人范罗苏姆(Guido van Rossum),别称:龟叔(Guido). python具有非常多并且强大的第三方库,使 ...
- 搭建 github 报错 Permission denied (publickey)
将 key 加入 github 出现如下问题 这是本地仓 user.name user.email 与 github 注册信息不一致造成 将本地仓 user 信息与 github 修改一致,出现如下问 ...
- JavaScript : 获取文件名后缀
/** 获取文件后缀 * * indexOf 和 lastIndexOf 都是索引文件 indexO ...