Python提速全攻略:PyPy、Numba、Cython等五大优化方案详解

每次有人聊起 Python 运行速度,话题往往走向“怎么给 Python 提速”。我没法用一句话回答,因为同样是慢,不同场景的瓶颈可能完全不一样:有的是 CPU 密集计算卡在循环里,有的是 I/O 等网络响应,有的是单纯内存分配太频繁。用错工具不仅白忙,甚至可能拖垮代码的可维护性。这篇内容我把这些年真正落地用过的提速方案整理出来,区分场景、给出可复跑的代码和避坑点,希望能帮你在自己的项目里少走几条弯路。

先说结论:Python 慢不是耻辱,但也不是一个只能用“继续用 C 重写”才能解决的问题。在实际项目里,换解释器、JIT 编译、静态类型编译、事件循环替换、多进程并行,都是成熟路子。你只需要先定位热点,再决定选哪条路。

1. 提升 Python 运行速度前,先搞清楚它到底慢在哪

1.1 动态类型和解释执行是两大根源

Python 的默认实现是 CPython,也就是社区通常说的官方解释器。CPython 会把.py文件先编译成字节码,再由虚拟机一条条解释执行。这个过程本身没有复杂的运行时优化,所以和编译型语言相比,纯 Python 循环的吞吐量天然吃亏。

更关键的约束是全局解释器锁,也就是常说的 GIL。它保证同一进程内同一时刻只能有一个线程执行 Python 字节码。多线程看起来在并行处理,但对 CPU 密集型任务,线程切换反而增加开销。很多开发者在 web 服务里用多线程跑计算任务,发现没有变快,多半就是这个原因。

动态类型也影响执行效率。比如一个a + b,解释器需要先检查 a 和 b 的类型,决定走整数加法、字符串拼接还是列表合并,然后才执行。每次循环都在重复这个流程,不像静态类型语言那样,编译阶段已经知道数据类型,直接生成对应的机器指令。

1.2 提速的本质上只有四条路

理解了上面的原理,提速思路就清晰了。第一条路是换一个带 JIT 的 Python 解释器,典型工具是 PyPy,它在运行时分析热点代码,把频繁执行的部分编译成机器码。第二条路是在源码层直接做 JIT 编译,比如用 Numba 给函数加装饰器。第三条路是把 Python 代码编译成 C 扩展,代表工具是 Cython,用静态类型声明换取执行速度。第四条路是绕开 GIL 或者让等待时间不浪费,通过多进程、异步事件循环优化整体吞吐。

这四条路没有绝对好坏。PyPy 最省事,但扩展兼容性有限;Numba 对数值计算很惊艳,但不适合业务逻辑代码;Cython 成熟稳定,但是要写额外的类型声明和构建步骤;异步方案则是把时间花在等待上的程序的天选答案。关键是根据你的程序画像来选择。

2. 换解释器提速:试试 PyPy

2.1 PyPy 为什么这么能打

PyPy 是 Python 语言的一个独立实现,内置 JIT 编译器。它不是给代码加补丁,而是直接把整个解释器替换掉。代码文件基本不用改,还是用 py 文件运行,只不过命令行工具从python换成了pypy3。

JIT 的核心逻辑是:程序在跑的时候,解释器会统计哪些函数反复执行,一旦认定是“热点”,就把它编译成机器码。后面再调用这个函数,走的就不是字节码解释流程,而是直接执行机器码。用递归这种典型场景测试,PyPy 的加速效果特别明显。下面这个计算斐波那契数的例子,在 CPython 上跑到 n 比较大的时候会很吃时间,但换 PyPy 往往能快五六倍甚至更多。

def fib(n): if n < 2: return n return fib(n - 1) + fib(n - 2) print(fib(30))

运行方式很简单,安装好 pypy3 后直接执行:

pypy3 fib.py

我曾在一个日志解析脚本上做过对比,原脚本要解析两千万行文本,里面大量使用字符串分割、正则匹配和列表操作。CPython 跑完大约 47 秒,PyPy 跑完 8 秒出头。因为这类脚本没有复杂的 C 扩展依赖,几乎是一次成功的迁移。

2.2 PyPy 迁移成本和容易翻车的点

PyPy 虽然省事,但坑也不少。最典型的问题出在 C 扩展上。很多常用库为了追求性能,底层用 C 或 C++ 实现,并通过 Python 的 C 扩展接口暴露给调用方。PyPy 对这种 C 扩展的整体支持度不如 CPython。比如基于 NumPy 生态的一系列工具,在 PyPy 上要么装不上,要么运行效率达不到预期。

如果项目里重度依赖 Pandas、Scrapy、部分数据库驱动,迁移前一定要先做小规模验证。实际操作中我见过一个爬虫项目,为了提速把整个代码切到 PyPy,结果某个采集组件依赖的 C 扩展无法安装,最后不得不回滚。后来只把其中的纯字符串处理子模块单独拎出来跑 PyPy,通过队列通信和主程序交互,才算实现部分加速。

另外 PyPy 的启动速度比 CPython 慢,内存占用也更高。短小的一次性脚本,或者本身只跑几百毫秒的任务,用 PyPy 反而不划算。JIT 预热需要时间,程序跑得不够久,收益根本覆盖不了成本。所以 PyPy 更适合“跑一次要几十秒甚至几分钟”的长时间脚本。

3. 给数值计算就地加速:Numba

3.1 一段代码看懂 @njit

Numba 是专门面向数值计算的 JIT 编译器,尤其适合写了大量 for 循环的 NumPy 代码。它和 PyPy 的“整包替换”不同,是精准到函数的。你在需要的函数上加一个装饰器,Numba 会在第一次调用时通过 LLVM 把函数编译成机器码,后续调用直接执行编译后的版本。

看一个经典场景:给一个大数组的所有元素求平方和。用纯 Python 循环写,一万个元素跑慢很正常,如果数据到千万级,那基本上要等很久。但 Numba 的版本几乎能吃掉循环的大部分开销,速度接近手动编写的 C 代码。

import numpy as np from numba import njit @njit def sum_of_squares(arr): total = 0.0 for i in range(arr.shape[0]): total += arr[i] * arr[i] return total data = np.random.rand(10_000_000) print(sum_of_squares(data))

注意上面用的是@njit,它是@jit(nopython=True)的简写,意思是不允许进入 Python 解释模式,必须全部编译成机器码。加了@njit后,Numba 对代码的类型要求和限制会更严格,但速度最有保障。

在实际项目里,Numba 特别适合蒙特卡洛模拟、金融定价、图像处理、数值积分这类逻辑简单但数据量大的任务。我优化过一个期权定价模型,先用 NumPy 向量化写,已经比纯 Python 快不少了,但内部的循环里仍然有复杂分支,向量化不好压。把核心函数加上@njit后,整体计算缩短了十倍左右。

3.2 实战中的限制与 trick

Numba 不是万能编译器,它在 no python 模式下只支持有限的数据类型和标准库函数。如果你在@njit函数里随手用一个自定义对象,或者调用某个 Python 动态特性,编译会失败。常见的做法是把自定义数据类型改用 NumPy 数组或普通标量表达,先把业务逻辑“降级”成数学计算。

另外一个容易被忽略的点是第一次调用的编译耗时。函数越复杂,编译时间越长。如果项目只是偶尔调用一次这个函数,那首轮延迟可能让人难以接受。解决办法有两个:一种是加cache=True参数,让编译结果缓存到磁盘,下个进程启动时直接复用;另一种是先用小数据触发编译,把预热时间放在启动阶段,而不是卡在关键任务上。

@njit(cache=True) def slow_math(x): ...

如果你对精度要求没那么苛刻,还可以开启 fastmath 优化,允许编译器重排运算、使用更激进的指令级优化。但这会改变浮点运算的舍入行为,不是所有场景都能接受,需要自己评估误差范围。

4. 优雅的静态编译方案:Cython

4.1 从纯 Python 到 .pyx

Cython 是 Python 的超集,允许在代码里写类似 C 的静态类型声明,最终编译成 C 代码并包装成 Python 扩展模块。相比 PyPy 和 Numba,Cython 更靠近底层,能够精细控制哪些变量用 Python 对象、哪些变量用原生 C 类型。

先看一个最简单的 Cython 示例,把数组平方和写成.pyx文件:

# fast_sum.pyx def fast_sum(double[:] arr): cdef int i, n = arr.shape[0] cdef double total = 0.0 for i in range(n): total += arr[i] * arr[i] return total

double[:]是内存视图类型,表示这个参数是一个双精度浮点数一维数组。声明之后,内部的i是 C int,total是 C double。循环里的加法不再经过 Python 对象层,速度自然上去。

要让这段代码运行,需要准备一个setup.py构建脚本:

# setup.py from setuptools import setup from Cython.Build import cythonize setup( ext_modules=cythonize("fast_sum.pyx"), )

然后在命令行里构建当前目录的扩展模块:

python setup.py build_ext --inplace

构建完成后,当前目录会生成一个类似fast_sum.*.so的文件,直接用 Python import 进来调用即可。

4.2 增量改造而不是重写

Cython 最让我喜欢的特性是它可以增量改造。你不用一下子就重写所有代码,而是先在性能热点函数上加静态类型声明,保留函数签名和调用方式不变,让大部分 Python 代码继续保持原样。这样做风险低,回归测试能兜底。

实际项目里,我的改造流程一般是这样的:先用性能分析工具定位最耗时的函数,把函数复制成一个.pyx文件,保留函数名和参数结构,然后逐行检查哪些循环变量可以声明成 C 类型,哪些容器能换成内存视图。接着构建扩展模块,在 Python 里 import 并做结果对比。确认数值一致后再把调用方切到新的扩展模块。

Cython 还支持和 C 代码直接互操作。比如cdef extern from "c_lib.h"可以声明引入外部的 C 函数,这是其他工具不太容易做到的。如果你的团队有 C/C++ 函数库,用 Cython 做胶水层是经典方案。

构建环节是 Cython 的主要门槛。在 Windows 上需要安装对应的 C/C++ 编译器,不同 Python 版本对应的工具链版本还不一样。好在多数发行版都有现成的构建工具链,装起来不算困难,但配置问题仍然会被初学者卡很久。这里建议先在一个简单 demo 上打通闭环,再对真实项目动手。

5. 不要只看计算:I/O 和并行工具同样重要

5.1 uvloop 把事件循环拉满

如果你的 Python 程序不是 CPU 密集,而是大量网络请求、数据库读写、消息队列消费,那瓶颈不在解释器执行速度,而在等待。这类程序用 asyncio 异步模型,能在一个线程里同时管理成千上万个连接。但 asyncio 的默认事件循环是用纯 Python 实现的,把网络事件分发开来的过程中依然有额外开销。

uvloop 是一个把底层事件循环替换成 C 实现的工具,API 和 asyncio 几乎一样,只需要在进程启动时指定策略。它在 Linux 和 macOS 上表现突出。我在一个内部监控服务上做过对比,接入 uvloop 后,同样配置下每秒处理的请求数提升了大约两到三成,代码改动只有几行。

import asyncio import uvloop asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) asyncio.run(main())

注意要在创建事件循环之前设置好策略,一般放在入口文件最前面。uvloop 并不是所有操作系统都支持,Windows 环境的支持相对有限,如果你是跨平台部署,需要加条件判断或者直接继续用自带 asyncio。

5.2 多进程绕开 GIL,但要算好通信成本

当程序确实需要用到多核 CPU 时,多线程并不是一个好的选择,因为 GIL 限制了同一时刻的活跃执行。多进程是更可靠的方式。Python 的concurrent.futures.ProcessPoolExecutor可以直接把任务分给多个进程去执行,近乎天然绕开 GIL。

from concurrent.futures import ProcessPoolExecutor def worker(x): # 这里是 CPU 密集型计算 return x * x with ProcessPoolExecutor(max_workers=4) as pool: results = list(pool.map(worker, range(1000)))

这个方案听起来简单,但有一个非常隐蔽的成本:进程之间传递数据需要序列化。如果每次任务传入的数据量很大,或者每个任务的计算时间很短,序列化和 IPC 的开销就会超过多进程并行带来的收益。最好的主力场景是“任务大、参数小”,比如每个 worker 要独立计算好几秒,只给它传一个整数索引。

另一种适用于并行计算场景的工具是 Taichi,它用装饰器风格定义计算内核,编译器自动做并行化和数据布局优化。Taichi 在处理粒子模拟、物理仿真、图形学算法时效率非常高,因为它能感知字段布局,自动把计算映射到 CPU 多核或 GPU。如果你在做这类偏图形学或数值仿真的事情,值得把它当成 Numba 之外的另一手准备。

6. 如何选工具:不同任务对号入座

6.1 一张表说清楚适用场景

我整理了一个快速选型参考表,你可以直接拿去对照自己的项目类型。这里的加速幅度是我在典型场景下观察到的经验值,不保证每个场景都一样,但排序和思路是有共性的。

项目类型推荐工具改造成本加速收益主要坑点
纯 Python 长耗时脚本PyPy低通常数倍第三方 C 扩展兼容性
数值计算、循环密集型Numba低数十倍部分 Python 类型不支持
需要精确控制底层接口Cython中高数倍到数十倍构建链配置
高并发网络服务uvloop极低吞吐明显提升平台兼容性
CPU 密集且无明显依赖关系ProcessPoolExecutor中随核数扩展序列化通信开销
物理仿真、粒子类计算Taichi中很高需要接受新语法

这张表不能完全替代基准测试,但它能帮你快速锁定第一优先尝试的工具。我见过有人明明写的是网络服务,却花了一周时间用 Cython 重写业务逻辑,结果收益被网络延迟完全淹没。这类判断失误,本质上就是没有做场景分类。

6.2 组合使用比单点优化更实际

真实项目往往不是一个工具打天下,而是多工具协同。比如一个服务模块,核心计算用 Numba 加速,网络 IO 用 uvloop,任务调度用多进程池,暴露给 Python 的复杂对象用 Cython 封装。这样做既发挥了每个工具的长处,又把风险限制在小模块内。

组合的避坑原则是隔离。每个加速模块都应该有独立的入口和明确的输入输出格式,最好是只接受 NumPy 数组、基本类型、字节串这类跨模块友好的数据。不要把带状态的复杂对象直接传进多进程或 JIT 函数,否则调试成本会直线上升。

我习惯在每个加速模块的边界处写简单的函数日志和结果校验。原因是加速工具一旦编译后,Python 的 traceback 往往不如原始代码清晰。如果函数内部崩溃,你看到的报错可能非常底层。边界校验能帮你快速定位是参数传入的问题,还是工具本身的问题。

7. 常见问题与排查实录

7.1 编译错误和环境问题

这几个工具最容易卡的环节是环境。PyPy 的 C 扩展安装失败时,错误信息会提示缺少某个二进制兼容层。不要硬装,先查一查目标库在 PyPy 下的支持列表。Numba 报“cannot determine Numba type”时,说明函数里的某个变量没法推断类型,一般把逻辑简化成基础数值运算就能解决。Cython 报链接错误时,先检查 Python 开发头文件和 C 编译器是否齐全,再检查是否有权限写入系统目录。

构建 Cython 模块时,我建议在虚拟环境下操作,并且每次修改.pyx后都要重新执行build_ext --inplace。如果你发现改动不生效,多半是 import 到了旧缓存。可以先把临时生成的.c文件和.so文件删除,再重新构建一次。

还要注意 Python 版本。像 Numba、Taichi 这类依赖 LLVM 的库,通常滞后于最新 Python 版本。你在官方文档看到“已支持”和“当前环境可用”之间可能还有距离。升级 Python 版本本身也许能带来少量速度提升,但代价可能是某些加速工具无法使用,升级前务必确认整个依赖链。

7.2 性能结果测起来不一致,可能是预热问题

很多人做完优化后,直接用脚本开始和结束时间对比,发现效果忽高忽低。这在 JIT 工具里非常常见。JIT 需要预热,尤其是 PyPy 和 Numba。第一次调用会先编译,后面几次才是优化后的速度。如果你只跑一次,很可能计的是编译时间。

正确做法是先做几轮“热身调用”,再进入正式计时。比如 Numba:

small = np.random.rand(1000) sum_of_squares(small) # 预热,触发编译 big = np.random.rand(10_000_000) start = time.perf_counter() sum_of_squares(big) print(time.perf_counter() - start)

同时,内存缓存页的冷热也会造成误差。最好同一个用例交替跑三轮以上,取中位数。不要因为某一轮结果就武断判断优化是否有效。也只有在这种严谨测试下,你才能判断某个工具是否真的适配当前任务。

7.3 这几年踩坑踩出来的经验

我在优化一个大规模数据处理模块时,最初直接上 PyPy,结果核心库不支持,被迫回滚。后来改用 Cython 做了增量改造,但很多函数类型标注写得不到位,速度提升并不理想。最后把所有循环逻辑重构成 NumPy 数组,只对最内层计算使用 Numba,才拿到稳定收益。整个过程让我明白,没有任何一个工具能压制所有情况。

我现在的基本套路是先用cProfile把热点函数找出来,计算热点占总耗时的比例。如果热点占 90% 以上,那值得花一周做深度优化;如果最高热点只占 30%,那先考虑调整整体架构,而不是急着用编译器。

如果你的程序里没有任何热点,所有函数时间都差不多,那其实不需要专门的加速工具。先优化数据结构和算法,把 O(n²) 改成 O(n log n),效果往往比上一堆编译器好得多。Python 生态里很多“慢”都是冗余计算和不合理的数据结构造成的,这类问题用工具是治标不治本。

最后再给一个小建议:凡是用到 JIT 或编译模块的项目,最好在 CI 里加一道冒烟测试,强制调用一次核心加速函数,保证它在每次变更后仍能正常编译和运行。否则很容易出现“今天代码能跑,明天换台机器就报编译器版本不匹配”的情况。把这些基础工作做扎实,提速工具才能真正变成你项目里的稳定资产。

相关新闻

Langchain4j AI Services:让Java大模型集成走向接口化

Langchain4j AI Services:让Java大模型集成走向接口化

1. Java 生态接大模型的别扭之处&#xff1a;从裸调 HTTP 到认识 Langchain4j大概半年前&#xff0c;我拿到一个很典型的 Java 后端需求&#xff1a;把公司内部的工单系统接上大模型&#xff0c;让用户用自然语言查“上周的工单为什么积压”&#xff0c;同时自动归类、生成总结…

2026/10/21 12:03:20 阅读更多 →
聊天机器人如何全链条再造新闻传播:生产、组织、分发与反馈

聊天机器人如何全链条再造新闻传播:生产、组织、分发与反馈

1. 从"对话即界面"说起&#xff1a;聊天机器人到底在改造新闻传播的哪一环这两年我一直在跟踪对话式交互产品在内容行业的落地&#xff0c;越做越觉得一个判断是对的&#xff1a;聊天机器人对新闻传播的改变&#xff0c;不是"多了一个分发渠道"这么轻描淡写…

2026/10/21 12:59:24 阅读更多 →
国产AI算力地基:硬件抽象层与运行时深度解析

国产AI算力地基:硬件抽象层与运行时深度解析

1. 项目概述&#xff1a;为什么说“国产算力的地基”比开源模型更值得致敬“致敬&#xff0c;DeepSeek 最新开源的不是模型&#xff0c;是国产算力的地基”——这句话在技术圈刷屏时&#xff0c;我正调试一套国产AI推理服务&#xff0c;卡在CUDA版本兼容性上整整两天。看到标题…

2026/10/20 9:47:18 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年&#xff0c;我大部分时间都在跟浏览器标签页打交道&#xff0c;直到第一次把桌面应用跑起来&#xff0c;才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词&#xff0c;最开始是在某段时间频繁出现在同事的讨论里&#xff0c;一个用HTML…

2026/10/21 9:32:40 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介&#xff1a;亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档&#xff0c;主要面向智能锁安装人员、终端用户及售后维护者&#xff0c;帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件&#xff0c;大小4.37MB&#xff0c;内容结构清晰&#xff…

2026/10/21 9:32:40 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统&#xff0c;整车要求空载跑到8m/s&#xff0c;电机转速已经拉到额定点&#xff0c;驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令&#xff0c;转速纹丝不动&#xff0c;三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/21 9:32:40 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年&#xff0c;用它写过嵌入式驱动、做过游戏服务端&#xff0c;也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词&#xff0c;我其实挺感慨的——这门语言的难点从来不是语法多&#xff0c;而是知识点之间的耦合太深…

2026/10/21 9:32:40 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介&#xff1a;亚太天能T109滑盖智能锁产品说明书以PDF格式发布&#xff0c;适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开&#xff0c;先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能&#xff0c;再给出完整安装步骤&…

2026/10/21 9:32:40 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历&#xff1a;翻开源码注释、论文摘要或者一份专业报告&#xff0c;每个字都认识&#xff0c;连在一起却像天书。想找人聊聊&#xff0c;身边要么没人懂&#xff0c;要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型&#xff0c;几秒钟之后&a…

2026/10/21 9:31:32 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事&#xff1a;AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里&#xff0c;按宣传口径&#xff0c;本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”&#xff0c;而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起&#xff1a;用户到底在追求什么“封号重开”这四个字&#xff0c;放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流&#xff0c;背后是大量的时间和精力成本。正常情况下&#xff0c;没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”&#xff0c;而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时&#xff0c;就意识到&#xff1a;单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/21 4:27:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →