[ Skill ] append1, append, nconc, tconc, lconc, cons 效率对比

https://www.cnblogs.com/yeungchie/

先说结论: cons > tconc, lconc >> nconc > append1, append

append1

lisp 复制代码
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

lisp 复制代码
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

lisp 复制代码
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

lisp 复制代码
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 来比较。

lisp 复制代码
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

lisp 复制代码
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

lisp 复制代码
let((a)
    ycTime(
        for(i 1 fix(6e7)
            a = cons(i a)
        )
    )
    length(a)
)
; UserTime  : 1.865164s
; SysTime   : 0.000000s
; WallClock : 1.865343s
; 60000000

这个函数又快不少,它是将元素追加到链表开头,因此不需要遍历元素,也不需要记忆节点。

由于是向前追加,元素顺序可能会跟我们期望的相反,这时候就需要降链表翻转一下,看看速度。

lisp 复制代码
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 差不多。

相关推荐
一级新生2 天前
LLM _ Agent _ Skill _ 专家 的关系与选型笔记
java·开发语言·人工智能·笔记·大模型·智能体·skill
終不似少年遊*4 天前
【Skill】为中型研发团队制作的敏捷迭代AI副驾Skill
人工智能·python·华为云·agent·ai编程·skill
feasibility.9 天前
不装Claude Code,WorkBuddy也能做视频,Remotion skill告别抽卡(含安装与使用)
人工智能·aigc·音视频·agi·skill·remotion·workbuddy
我是小邵10 天前
1024 特辑:我写过的 Skill,正在变成 AI 编程的基础设施
人工智能·agent·ai编程·skill·知识沉淀·协作·开发者工具
古法搬砖工11 天前
MCP:给 AI Agent 装一个“万能 USB 接口”
人工智能·skill·mcp·搬砖工
大连好光景17 天前
内置skill(如/code-review、/debug)与内置命令(如/help、/compact)的区别
skill·内置skill·内置命令·skill的安全边界
SuperHeroWu718 天前
【HarmonyOS 7】 HarmonyOS 应用 Skill创建和编排详解
华为·harmonyos·开放平台·skill·小艺
OxYGC20 天前
[玩转大模型] 第十一篇:售卖自己的 Skill——买断、订阅、定制、开源+付费增强,四条路到底哪条能收到钱
开源·大模型·agent·变现·skill
Jarming22 天前
infinite-creation本地AI短剧带货项目推荐-本地运行无费用0负担
agent·qwen·skill·minimax·deepseek·skills·agent-skills·minimax-h3
Pniubi22 天前
基于openclaw实现自定义mcp/skill(第三章)
自研·skill·openclaw