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

翻转增加了一点耗时,速度跟 tconclconc 差不多。

[ Skill ] append1, append, nconc, tconc, lconc, cons 效率对比的更多相关文章

  1. python中列表的insert和append的效率对比

    python中insert和append方法都可以向列表中插入数据只不过append默认插入列表的末尾,insert可以指定位置插入元素. 我们来测试一下他俩插入数据的效率: 测试同时对一个列表进行插 ...

  2. Snapman系统中TCC执行效率和C#执行效率对比

    Snapman集合了TCC编译器可以直接编译执行C语言脚本,其脚本执行效率和C#编译程序进行效率对比,包括下面4方面: 1.函数执行效率 2.数字转换成字符串 3.字符串的叠加 4.MD5算法 这是C ...

  3. 进程and线程and协程效率对比

    1.进程与进程池的效率对比 多进程:p.start()过程中,只是向操作系统发送一个信号,至于什么时候执行,都是操作系统的事情,操作系统接收到信号时,帮该进程申请一块内存空间+拷贝父进程的地址空间 # ...

  4. string中Insert与Format效率对比、String与List中Contains与IndexOf的效率对比

    关于string的效率,众所周知的恐怕是“+”和StringBuilder了,这些本文就不在赘述了.关于本文,请先回答以下问题(假设都是基于多次循环反复调用的情况下):1.使用Insert与Forma ...

  5. FileInputStream 与 BufferedInputStream 效率对比

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3550158.html ,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体 ...

  6. java中多种写文件方式的效率对比实验

    一.实验背景 最近在考虑一个问题:“如果快速地向文件中写入数据”,java提供了多种文件写入的方式,效率上各有异同,基本上可以分为如下三大类:字节流输出.字符流输出.内存文件映射输出.前两种又可以分为 ...

  7. golang 浮点数 取精度的效率对比

    需求 浮点数取2位精度输出 实现 代码 package main import ( "time" "log" "strconv" " ...

  8. SIMD---SSE系列及效率对比

    SSE(即Streaming SIMD Extension),是对由MMX指令集引进的SIMD模型的扩展.我们知道MMX有两个明显的缺点: 只能操作整数. 不能与浮点数同时运行(MMX使用FPU寄存器 ...

  9. 查询最新记录的sql语句效率对比

    在工作中,我们经常需要检索出最新条数据,能够实现该功能的sql语句很多,下面列举三个进行效率对比 本次实验的数据表中有55万条数据,以myql为例: 方式1: SELECT * FROM t_devi ...

  10. 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 ...

随机推荐

  1. iOS安全加固探讨:代码混淆、类名方法名混淆等方法

    摘要:本文探讨了iOS平台下的安全保护,以及几种常见的加固方法,包括字符串加密.类名方法名混淆.程序代码混淆和加入安全SDK等.通过这些方法,我们可以有效地提高iOS应用的安全性. 引言: 随着智能手 ...

  2. 九、dockerfile指令讲解

    系列导航 一.docker入门(概念) 二.docker的安装和镜像管理 三.docker容器的常用命令 四.容器的网络访问 五.容器端口转发 六.docker数据卷 七.手动制作docker镜像 八 ...

  3. 如何实现纯网页语音视频聊天和桌面分享?(附源码,PC版+手机版)

    在网页里实现文字聊天是比较容易的,但若要实现视频聊天,就比较麻烦了.本文将实现一个纯网页版的视频聊天和桌面分享的Demo,可直接在浏览器中运行,不需要安装任何插件. 一. 主要功能及支持平台 1.本D ...

  4. connect() failed (113: No route to host) while connecting to upstream

    转载请注明出处: 用docker 搭建的服务,今天重启了一个容器之后,请求这个服务的接口都变成了 502, 但通过docker 查看日志,发现没有异常,端口也都是正常,在nginx的日志中看到了这段错 ...

  5. MySQL的SQL优化常用30种方法[转]

    MySQL的SQL优化常用30种方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或< ...

  6. DC - 设计和工艺数据

    环境建立命令与变量 综合主要的三部分:RTL\目标工艺库\约束文件 DC综合过程中timing > area,在时序满足的条件下进行面积优化 RTL一般会映射为standcell(与非门),需要 ...

  7. AMBA总线介绍-01

    AMBA总线介绍 AMBA总线概述 AHB APB 不同IP之间的互连 1.系统总线简介 系统芯片中各个模块之间需要有接口连接,使用总线作为子系统之间共享的通信链路 优点:成本低,方便易用(通用协议, ...

  8. 【滤波】Kalman Filter

    from: 卡尔曼滤波教程 (kalmanfilter.net) 总览 关于本教程 关于作者 关于卡尔曼滤波 为什么需要预测算法 卡尔曼滤波简介 必要的背景知识 均值和期望 方差和标准差 正态分布 随 ...

  9. 2023年春秋杯网络安全联赛冬季赛-CRYPTO MISC WP

    浅谈:*代表未做出的,赛后复现了一下.本次题目还是挺有意思的,比赛期间做啦俩.题目有很多值得学习的东西.顺便在此记录一下.继续努力吧!! CRYPTO not_wiener(中等) 题目附件 查看代码 ...

  10. 【秘籍揭秘】如何高速下载游戏、Switch资源?省时省力一网打尽!

    百度云盘SVIP合租啦亲爱的考研党和游戏玩家们,我今天要分享的是一份独家秘籍!你是不是常常为下载游戏或Switch资源而烦恼?是不是经常遇到下载速度慢.限速等问题,让你等待无尽?别担心,我有一个绝密的 ...