尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Python进阶必学:栈和队列在AI实战中的深度应用与性能优化
学Python学到一定程度你会明显感觉到一个分水岭基础语法都顺了列表、字典、循环、函数随便写可真要接触人工智能方向的实战项目比如让程序自己走迷宫、批量处理训练数据、写一个简易的规则引擎时代码反而会在一些很不起眼的地方卡住。卡住的原因往往不是算法不够炫而是栈和队列这两个最基础的数据结构没吃透。我见过太多人把Python当成有轮子就装的工具箱遇到问题第一反应是import结果连deque和list的性能差异都说不清更别提在AI任务调度、深度优先遍历这些场景里自己手写一个栈或队列了。这篇文章就针对Python进阶阶段最值得花时间的栈和队列把原理、性能、实战和排坑一次讲透适合正在补数据结构、刷算法题、准备转型AI方向或者做全栈项目时需要自己搭任务队列的朋友。1. 为什么人工智能编程绕不开栈和队列1.1 先别急着刷题想清楚它们在解决什么问题很多人一提到栈和队列第一反应就是面试题竞赛题总觉得和人工智能八竿子打不着。这个印象其实大错特错。栈和队列不是某种特定算法而是两种最基本的访问控制策略栈是后进先出LIFO队列是先进先出FIFO。它们俩从哲学上就代表了两种完全不同的资源管理思路几乎所有的系统设计最终都会落到其中一种上。举个生活化的例子。栈就像你摞碗碟后放上去的永远最先被拿走。你在一个函数里调用另一个函数再调用另一个函数程序内部的调用关系就是一层层摞起来的回来的时候得一层层揭开这就是函数调用栈。队列则像食堂排队打饭先来的人先打到饭后来的依次排着。AI训练时数据样本按顺序流入模型推理结果按顺序送出去这种先进先出的管道几乎就是队列的原型。在Python里栈和队列的实现看起来都很简单栈可以用list的append和pop队列可以用collections.deque的append和popleft。但真正理解它们不等于知道这两个API。关键在于你得清楚它们各自适合什么场景、时间复杂度是多少、在并发环境下会不会出问题以及它们在人工智能项目里到底以什么形态出现。1.2 从调用栈到AI推理看不见的栈和队列如果只把栈和队列当成刷题工具你会错过很多真正重要的东西。先说栈。你在Python里写函数每次调用都会在内存中创建一个栈帧里面保存着局部变量、参数、返回地址。函数层层调用栈帧就层层创建直到最深一层运行完再逐层销毁。这个函数栈帧的创建与销毁过程是理解递归、理解异常回溯甚至理解程序崩溃时那堆报错信息的钥匙。再说队列。你在做AI项目时经常要处理数据管道原始数据读取、清洗、增强、喂给模型、收集结果。如果所有步骤都用同步代码顺序执行整个流程会被最慢的一步卡死。合理的做法是用队列把各个阶段解耦——生产者往队列里放数据消费者从队列里取数据谁快谁慢都无所谓中间有缓冲区兜着。哪怕是深度学习框架本身内部的算子调度、数据加载器也都大量依赖队列。PyTorch的DataLoader默认会用多进程配合队列来预取数据背后的设计思路和经典的生产者消费者模型一模一样。所以说栈和队列不是AI的周边知识而是AI工程化绕不开的地基。地基不稳后面搭什么都晃晃悠悠。2. Python高级用法栈和队列的正确打开方式2.1 别用list硬刚性能分析告诉你真相Python里的list太灵活了什么都能装以至于很多人习惯用一个list同时模拟栈和队列往头部插数据、往尾部弹数据用得挺开心。直到数据量变大才发现程序慢得像爬。关键在于时间复杂度。list的append和pop都是操作尾部均摊下来是O(1)所以用它模拟栈没问题。但一旦你要在头部做操作比如pop(0)或者insert(0, item)底层就要把整个数组的元素全部移动一遍代价是O(n)。如果你的队列里有十万条数据每取一条就要搬十万次这个开销直接爆炸。我自己实测过用list模拟一个十万元素的队列不断pop(0)再append跑完需要好几秒换成deque后同样操作只需要几毫秒。差距不是百分之几十是上千倍。所以结论很明确在Python里做队列首选collections.deque不要图省事用list。操作listdeque尾部appendO(1)O(1)尾部popO(1)O(1)头部pop(0) / popleftO(n)O(1)头部insert(0, item)O(n)O(1)随机访问O(1)O(n)这里还有个容易被忽略的细节deque虽然两头操作都很快但它是双向链表加块状存储实现的随机访问需要从头或从尾遍历到中间所以如果你需要经常按下标取元素deque反而不如list。数据结构的选型没有银弹一切看你的核心操作是什么。2.2 用deque实现栈和队列的完整代码直接给一套可以抄走的写法。栈用list就足够了但为了统一风格也可以直接用deque性能上完全没问题。from collections import deque # 栈后进先出 stack deque() stack.append(任务A) stack.append(任务B) stack.append(任务C) print(stack.pop()) # 任务C print(stack.pop()) # 任务B print(stack[-1]) # 任务A只看栈顶不弹出 # 队列先进先出 queue deque() queue.append(样本1) queue.append(样本2) queue.append(样本3) print(queue.popleft()) # 样本1 print(queue.popleft()) # 样本2 print(queue[0]) # 样本3只看队头不弹出写代码时有个细节要注意deque的pop()弹出的是右边popleft()弹出的是左边append()默认加到右边appendleft()加到左边。如果你把四者的方向搞混代码可能运行不报错但逻辑完全反了。我踩过这个坑用deque做队列时习惯性写了queue.pop()结果取出来的始终是最后进去的元素整个处理顺序全乱排查了半天才发现问题。如果需要一个固定大小的队列可以用deque(maxlenN)满了之后新元素会从另一头把旧元素挤掉。这个特性在做滑动窗口统计时特别好用比如实时计算最近N条日志的平均耗时一行代码就能维护一个自动淘汰的窗口。2.3 queue模块阻塞队列与线程安全deque适合单线程但在多线程AI任务调度场景下直接用deque会有两个麻烦一是线程安全需要自己加锁二是没有现成的阻塞机制。Python标准库里的queue模块就是为这个问题准备的它提供了线程安全的队列实现。最基本的是queue.Queue它是一个FIFO队列。它的get()默认会在队列为空时一直阻塞等待直到有数据进来put()则会在队列满时阻塞直到有空位。这就是大家常说的阻塞队列。还有一个queue.LifoQueue行为就是栈queue.PriorityQueue则是优先队列元素会按优先级顺序被取走。很多新手搞不明白python队列queue不堵塞是怎么回事其实是因为get()和put()都有非阻塞变体get_nowait()拿不到数据立刻抛出queue.Emptyput_nowait()放不进去立刻抛出queue.Fullget(timeout2)和put(item, timeout2)则是指定最多等待时间。这些非阻塞写法本身没有错但很多人代码写完后发现程序跳过某些数据原因就是误用了非阻塞接口队列一空就抛异常退出连重试的逻辑都没写。我习惯的做法是生产者消费者模型里消费者用带超时的get循环中捕获queue.Empty后判断退出条件生产者用阻塞的put避免无脑塞爆内存。示例如下import queue import threading import time task_queue queue.Queue(maxsize5) def producer(q): for i in range(10): item f数据-{i} q.put(item) print(f[生产者] 放入 {item}) time.sleep(0.3) def consumer(q): while True: try: item q.get(timeout2) except queue.Empty: print([消费者] 两秒内没有新数据退出) break print(f[消费者] 处理 {item}) q.task_done() threads [threading.Thread(targetproducer, args(task_queue,)), threading.Thread(targetconsumer, args(task_queue,))] for t in threads: t.start() for t in threads: t.join()这里的关键是task_done()和join()的配合join()会阻塞直到队列中所有已放入的数据都被task_done()标记为处理完毕。如果你的消费者直接退出而忘了task_done()join()可能永远等不完程序就像卡死一样。这种问题不报错、不崩溃特别坑只能靠排查队列的状态或仔细读代码才能发现。3. 核心场景实操栈和队列在AI项目里怎么落地3.1 用栈实现深度优先搜索AI路径规划讲完基础用法来点真正能上手的项目实战。先说栈最经典的用武之地深度优先搜索DFS。在AI领域DFS常见于路径规划、状态空间搜索、逻辑推理树展开等场景。比如在一个地图网格里找一条从起点到终点的可行路径DFS的思路就是一条路走到黑走不通再退回来换个方向这个退回来的操作天然就是栈的弹栈。用显式栈写DFS可以避免递归带来的深层调用问题代码也直观def dfs_with_stack(graph, start): visited set() stack [start] while stack: node stack.pop() if node in visited: continue visited.add(node) print(node, end ) # 保持访问顺序更直观可以先反转邻居列表 for neighbor in reversed(graph[node]): if neighbor not in visited: stack.append(neighbor) return visited graph { A: [B, C], B: [A, D, E], C: [A, F], D: [B], E: [B, F], F: [C, E], } dfs_with_stack(graph, A) # 输出示例A B D E F C注意这里我用了reversed(graph[node])这是为了让实际访问顺序和递归版本尽量一致。如果不加这个反转由于栈的后进先出特性邻接表里靠后的邻居会先被访问最终的遍历顺序会不一样。在路径规划类AI项目中遍历顺序不只影响打印还影响找到路径的形态。比如同样是从左上到右下先往下走还是先往右走找到的路径可能不同。那什么时候该用显式栈而不是递归两个判断标准一是递归深度可能超过Python的默认递归上限通常是1000层图很深时直接用递归会抛RecursionError二是每个节点需要携带额外状态比如记录当前路径、维护一个局部变量用显式栈更容易把状态封装成元组塞进栈里。我在写全栈项目的路由遍历时就特别喜欢用显式栈去扫描目录树既能控制深度又不容易爆栈。3.2 用队列实现广度优先搜索最短路径与层级遍历广度优先搜索BFS对应的数据结构就是队列。BFS的特点是按层推进先访问起点周围的一圈节点再访问再外一圈。这个一圈一圈扩散的特性使得BFS在无权图上天然能找到最短路径因为它是逐层扫描的第一次到达目标节点时必然经过最少的边数。在AI里BFS几乎无处不在迷宫最短路径、八数码问题、单词接龙、状态空间搜索、语义网络里的层级关系遍历都能用同一套模板套用。from collections import deque def bfs_shortest_path(graph, start, target): queue deque([start]) visited {start: 0} # 记录每个节点的步数 while queue: node queue.popleft() distance visited[node] if node target: return distance for neighbor in graph[node]: if neighbor not in visited: visited[neighbor] distance 1 queue.append(neighbor) return -1 # 不可达 print(bfs_shortest_path(graph, A, F)) # 输出 2路径 A - C - F 或 A - B - E - F 的简化结果这段代码的一个关键操作是popleft()它保证我们每次从队列头部取出当前层尚未处理的节点新发现的节点则加到尾部不会打乱层级顺序。如果把popleft()换成pop()BFS就退化成了DFS最短路径搜索立刻失效。这个bug极其隐蔽因为代码不报错图的遍历顺序也看似正常只有结果不符合预期时才会让人一头雾水。BFS的空间复杂度通常比DFS高因为它需要保存一整层的邻居。在极端情况下比如一个非常宽的大图队列里可能同时塞入大量节点。所以做AI搜索时如果内存紧张可以先估算节点数量和分支因子决定到底用DFS还是BFS不要顺手选一个。3.3 基于栈的算术表达式求值从编译原理到AI推理搜索热词里有一条编程题实训-实验2-基于栈的算术表达式求值算法这个实验几乎是计算机专业学生的标配但它绝对不是只为了考试。表达式求值是编译器前端的基础环节而编译器、解释器的思路同样被用在AI推理引擎中比如解析自然语言算数题、配置规则引擎、处理用户输入的公式等。经典的实现思路是调度场算法把中缀表达式人类写的34*2/(1-5)转换成后缀表达式342*15-/再用栈求值。整个过程频繁使用栈来暂存操作符和处理括号优先级。def infix_to_postfix(expression): precedence {: 1, -: 1, *: 2, /: 2, (: 0} output [] stack [] for ch in expression: if ch.isdigit() or ch.isalpha(): output.append(ch) elif ch (: stack.append(ch) elif ch ): while stack and stack[-1] ! (: output.append(stack.pop()) stack.pop() # 丢弃左括号 else: while stack and precedence.get(stack[-1], 0) precedence.get(ch, 0): output.append(stack.pop()) stack.append(ch) while stack: output.append(stack.pop()) return .join(output) def evaluate_postfix(expression): stack [] for ch in expression: if ch.isdigit(): stack.append(int(ch)) else: right stack.pop() left stack.pop() if ch : stack.append(left right) elif ch -: stack.append(left - right) elif ch *: stack.append(left * right) elif ch /: stack.append(int(left / right)) return stack.pop() postfix infix_to_postfix(34*2/(1-5)) print(postfix) # 342*15-/ print(evaluate_postfix(postfix)) # 1这段代码里最值得琢磨的是操作符弹出的条件只有当前操作符的优先级不高于栈顶操作符时才把栈顶弹出去。这么做的原因是保证同优先级的运算从左到右结合不会打乱顺序。如果这个条件写错3-2-1这种同优先级连续运算就会计算出错得到2而不是0。我之前在做一个简易公式计算器AI小项目时就是对这一行优先级判断掉了链子结果带括号的表达式结果总是不对。排查了半天最后打印出每一步的栈内容才定位到问题。所以如果你手写调度场算法强烈建议在学习阶段输出output和stack每一步的状态配合小表达式一行行比照比直接抄代码有效得多。3.4 队列的进阶场景生产者消费者与AI任务调度前面在2.3节已经提到了queue模块的用法这里我想把它放到更大的AI工程语境中展开。很多AI项目不只是一段模型推理代码而是一条完整的数据流水线数据采集、预处理、特征提取、模型推理、结果后处理。如果每步都用函数串行调用任何一个环节变慢整个流水线都得等。用队列做解耦后每个环节可以独立成生产者或消费者各自跑在单独的线程或进程里。一个典型场景是实时图像识别。摄像头持续采集画面采集速度可能时快时慢识别模型推理也需要时间。如果把采集和识别直接耦合采集太快会丢帧识别太慢会卡顿。用队列缓冲后采集端只管往队列里放识别端只管从队列里取中间缓冲区可以吸收两者的速度差异。这就是我在实际项目里最常用的队列落地方式。当我们进一步把队列换成分散在各机器上的消息队列系统时就进入了分布式AI调度的领域。网上热词里有消息队列重复消费问题这是所有消息中间件使用时都躲不开的坑消费者处理完一条消息后还没来得及确认进程就崩了消息被重新投递结果这条数据被处理了两次。这类问题在AI任务里尤其危险比如重复计费、重复写入训练样本、模型重复推理等。解决的通用思路是幂等设计让同一个任务无论执行多少次结果都保持一致。以训练样本写入为例可以为每条消息带上唯一ID在处理前先查一下这个ID是否已处理过处理完写入结果表。这样一来即使消息重复投递效果也像只执行一次。在实现上queue.Queue本身不具备跨进程或跨机器的消息确认机制要上真正的毫秒级分布式队列就需要引入中间件但核心思路仍然是生产者、缓冲、消费、确认、幂等这套模型。4. 常见问题与排查技巧实录4.1 栈溢出递归深度、系统调用栈与函数栈帧栈溢出是编程里最经典也最容易让人崩溃的报错之一。在Python里最常见的形式是RecursionError: maximum recursion depth exceeded。这个报错背后的原理就是函数栈帧的创建与销毁每次递归调用都会在调用栈上压入一个栈帧Python为了保护系统资源默认限制了递归深度。需要注意的是这个限制不是算法不行的标志而是Python解释器的自我保护策略。如果你确实需要更深的递归可以用sys.setrecursionlimit(10000)抬高限制但我不建议你这么干。递归过深时即使没有触发RecursionError也可能导致内存占用过大甚至让操作系统层面的真实栈空间耗尽进而让进程直接崩溃。与其提高上限不如改成迭代加显式栈。真正排查问题时要会读异常回溯backtrace。Python报错时从最下面往上看最后一行是具体错误前面的每一行都对应一个栈帧从外到内层层嵌套。我见过不少人拿着网上抄来的代码一遇到RecursionError就束手无策其实只要把报错信息中的栈帧一行行读下去就能看清递归是在哪一步失控的是一路跑到终点忘了返回条件还是终止条件本身永远不满足。4.2 队列“不堵塞”的真相timeout、get_nowait与空队列热词里有一条python队列queue不堵塞看起来像个矛盾说法队列怎么会不堵塞其实这是对queue.Queue的误解。get()默认是阻塞的但如果有人调用了get_nowait()或者设置了timeout队列就会在为空时抛异常或直接返回看起来就像不堵塞了。我记得有个朋友调试一个AI数据加载器发现训练过程中偶尔少处理几条数据。后来仔细看代码发现消费者用了get_nowait()一旦两个生产者短暂没有放数据消费者就捕获到queue.Empty异常直接退出了循环。这种bug十万分隐蔽因为程序正常运行、不报错、数据量大的时候缺失的比例很小不仔细对数量根本看不出问题。这里分享一个排查套路如果你的程序用到队列但功能时好时坏先在每次get和put前后把队列长度打印出来或者记录一条带时间戳的日志。然后重点看空队列和非空队列的切换瞬间大概率能找到问题。另外设置timeout时不要设得太短AI任务的执行时间波动很大2到5秒是常见选择设成0.1秒这种网络抖动一下消费者就假死了。4.3 性能坑list当队列、pop(0)和insert(0)滥用这个坑我在2.1已经提过但值得在排障实录里再强调一次因为它真的太常见了。搜索热词里还有python队列queue不堵塞和python构建邻接矩阵说明大量人在用Python搞算法和AI数据预处理而性能问题正是这类代码最容易翻车的地方。用list模拟队列时每次pop(0)的时间复杂度是O(n)数据越多越慢。如果只是几百条数据肉眼根本感知不到一旦数据量到了几万、几十万性能差距就非常显著。我做过一个实验十万条数据的循环pop(0)list耗时超过2秒deque只有0.002秒左右差了三个数量级。还有人在做滑动窗口时用list的insert(0, x)加pop()以为挺方便实际上每次插入头部到要移动整个数组同样是大坑。如果你发现自己用list做队列请立刻换成deque。如果代码里出现pop(0)或者insert(0, ...)停下来想一想有没有更合理的结构。写算法题、写AI数据管道时能用deque别硬用list是一条非常实用的原则。操作时间复杂度建议替代list.pop(0)O(n)deque.popleft()list.insert(0, item)O(n)deque.appendleft(item)list.append(item)均摊O(1)不需要替代deque[i]O(n)需要下标访问时改回list4.4 单调栈揭秘一个看似小众但竞赛和面试常考的栈变种热词里有一条单调栈揭秘还有一条c 栈 竞赛用的多吗。在Python算法进阶里单调栈同样是个高频考点只是很多人第一次听到单调两个字就被吓住了。所谓单调栈就是栈内元素保持单调递增或单调递减的顺序。插入新元素时会把破坏单调性的旧元素弹出去利用这个特性可以高效解决一类找下一个更大/更小元素的问题。举个最简单的例子给定一个数组返回每个元素右侧第一个比它大的数字没有则返回-1def next_greater_element(nums): n len(nums) result [-1] * n stack [] for i, value in enumerate(nums): while stack and nums[stack[-1]] value: idx stack.pop() result[idx] value stack.append(i) return result print(next_greater_element([2, 1, 4, 3])) # [4, 4, -1, -1]这个算法的精妙之处在于每个元素最多入栈一次、出栈一次总时间复杂度是O(n)而暴力解法是O(n²)。如果数组有十万个元素暴力解法可能要算上亿次比较单调栈在一趟循环内就能搞定。在AI场景里这种连续区间最值的计算常常出现在数据预处理环节比如计算时间序列中的局部高点、寻找K线图上的突破位等。作为进阶内容我建议你把单调栈的模板吃透同时搞清楚它和普通栈的区别普通栈只是先进后出的工具单调栈在入栈前多做了一步保持单调性的弹栈操作。这一步看似简单却是整个算法效率的核心。面试时如果能顺手讲清楚单调栈的空间、时间复杂度和适用条件会比单纯报出答案能给人留下更深的印象。4.5 线程安全、task_done和join多线程队列的边界问题最后这条排障心得来自我维护的多个Python服务多线程场景下使用queue.Queue时最隐蔽的问题往往不是队列本身而是任务完成的标记机制。task_done()必须在消费完一条数据后调用而join()则等待队列中的所有数据都被标记为完成。我见过不止一次这样的代码消费者从队列中取数据后在处理过程中异常退出了task_done()没来得及执行。主线程那边queue.join()就永远等不完程序挂在那里看起来像死锁实际上只是任务完成标记丢失了。排查这类问题时如果程序卡在join()且没有明显错误信息优先检查消费者是否在每条数据上都调用了task_done()尤其是异常分支和break分支。生产者也一样。使用put(item, timeout...)时如果队列满了而生产者超时放弃注意数据是否真的丢了。AI任务里的每一条数据都可能是有价值的样本宁可多等待也不要静默丢弃。我的习惯是生产者用阻塞式put消费者用带超时和异常处理的get并在消费者退出前确保所有已取出的数据都执行过task_done()。个人实操体会说句实在话栈和队列在Python里总共就那么几行代码我当初也一度轻视过它们。真正让我改变看法是在做AI数据管道时被一个莫名其妙的乱序问题折磨了一整天训练数据经过多线程预处理后喂给模型的顺序完全乱了模型效果忽好忽坏。后来发现就是某个中间模块用了list.pop()而不是deque.popleft()队列硬生生被写成了栈。从那次以后我在项目里对每一个存取顺序敏感的地方都格外较真凡是先进先出的就绝不写成后进先出凡是可能并发访问的队列就优先用queue.Queue。数据结构这门课教的不只是API更是一种对数据在系统中如何流动的直觉。你写AI程序时从数据进来到结果返回每一步到底是以什么顺序流过去的想清楚这个问题很多bug根本不会发生。希望这篇内容能帮你在Python进阶的路上少走几个我走过的弯路。
RELATED

相关推荐

显存告急?VoiceBox 本地推理的 CUDA 优化实战笔记

显存告急?VoiceBox 本地推理的 CUDA 优化实战笔记

显存告急?VoiceBox 本地推理的 CUDA 优化实战笔记 【免费下载链接】voicebox The open-source AI voice studio. Clone, dictate, create. 项目地址: https://gitcode.com/GitHub_Trending/voicebox1/voicebox "本地跑 TTS,先看显存够不够&q…

📅 2026/10/10 16:58:32
TRON波场链监控与交易实战:事件轮询、确认机制与安全签名

TRON波场链监控与交易实战:事件轮询、确认机制与安全签名

简介:面向Java开发者的波场TRON链监控与交易系统源码资源,适合有区块链基础或正在开发USDT收款、链上监听场景的工程师参考。内容覆盖HD钱包生成、TRX与TRC20代币余额查询、冻结TRX获取资源权益、转账签名广播、交易与区块信息查询以及指定账户的实时交易…

📅 2026/10/10 16:58:32
系统架构师考试必看:用记忆宫殿轻松记住11个常用端口号

系统架构师考试必看:用记忆宫殿轻松记住11个常用端口号

系统架构师考试复习最痛苦的环节之一,就是背协议端口号。我当年备考的时候,把教材翻来覆去看了好几遍,FTP用21还是20、TFTP是不是69、SNMP到底是161还是162,每次以为自己记住了,合上书立刻模糊。后来我想明白了一件事&…

📅 2026/10/10 16:58:32
MORE NEWS

更多资讯

📰

软件评审检查表:从需求到测试的逐项评审实践指南

简介:这是一份面向软件设计与开发评审场景的实用检查表文档,适合项目经理、架构师、开发人员和质量管理人员使用。文档将评审过程拆解为需求规格说明书检查、概要设计检查和详细设计检查三大模块,覆盖清晰性、完整性、依从性、一致性、可行性…

📰

Cline 实战踩坑实录:Token 烧钱、权限误伤、上下文爆炸,这三座大山怎么翻?

Cline 实战踩坑实录:Token 烧钱、权限误伤、上下文爆炸,这三座大山怎么翻? 【免费下载链接】cline Autonomous coding agent as an SDK, IDE extension, or CLI assistant. 项目地址: https://gitcode.com/GitHub_Trending/cl/cline 开…

📰

AI 时代还需要传统搜索引擎吗?Hister 的 MCP 集成给出了另一种答案

AI 时代还需要传统搜索引擎吗?Hister 的 MCP 集成给出了另一种答案 【免费下载链接】hister Your own search engine 项目地址: https://gitcode.com/GitHub_Trending/hi/hister ChatGPT 式 AI 搜索的爆发,让一个原本不成问题的问题重新摆上台面&…

📰

Visual Basic .NET 控制台编程入门实战:基于 learnxinyminutes-docs 的完整代码教程

文档教程 【免费下载链接】learnxinyminutes-docs Code documentation written as code! How novel and totally my idea! 项目地址: https://gitcode.com/gh_mirrors/le/learnxinyminutes-docs 点击查看 免费下载 本教程以仓库内 zh-cn/visualbasic.md 为核心蓝本…

📰

1.9B 当决策引擎:NeoHorse-1-9B 接入工单分流的最小实现

1.9B 当决策引擎:NeoHorse-1-9B 接入工单分流的最小实现 【免费下载链接】NeoHorse-1-9B 项目地址: https://ai.gitcode.com/hf_mirrors/TokenRhythm/NeoHorse-1-9B 工单分流(Ticket Routing)是客服与运维系统里最典型的"文本 →…

📰

遗留代码单元测试实战:从难测到可测的完整路径

接手一套别人写了好几年、注释几乎没有、一上线就没停过修的代码,我第一反应不是打开编辑器开冲,而是先给自己提个问:现在哪些地方是改了必出事的?如果你想给遗留代码补单元测试,却不知道从哪下手,这篇文章…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬