普通视图

浑身瑕疵

2025年12月3日 08:23

有时候我还真不明白,为什么现在大家把AI吹得那么牛逼。因为就是我的使用体验而言,我觉得在写代码的时候,AI真的是挺糟糕的.我用的AI是Deepseek。

理论上无论我用的是什么AI,它们都应该是写代码的高手,无论是写什么类型的代码都应该没什么问题。我这么低端的用户,也不会提出一些什么高端的要求,但事实证明,不知道是我提要求提的不够精准还是怎么着,反正出来的结果我个人感觉基本上没有一次就能符合我的要求。有些时候的确能接近生成我想要的结果,但更多时候那串代码当你复制下来运行的时候会发现根本运行不了。对一个什么都不知道的小白在代码运行不了的时候可以怎么办呢?换一个AI继续提问继续复制粘贴?但如果这个AI有问题,其它AI会不会也有问题呢?为什么人家觉得那个玩意那么神奇,但我自己的使用体验却那么差呢?是不是因为AI已经判断出我这个人是个挑剔的完美主义者,所以故意给我些有瑕疵的东西?每一次都有瑕疵,每一次的瑕疵都说不准在什么地方,幸好绝大多数情况之下,我要的不是AI的全过程,我只是要参考一下它的思路而已。当我要求它给我写某个代码的时候,实际上我更看重的是它用什么途径,而不是它的代码具体是什么。如果它的代码能顺利运行,那当然好,但实际上我感觉一次性就能成功运行的几率可能不足10%。

当我给出一串数字,要求它给我做数据分析。噼里啪啦一大段字很牛逼,一贴进去发现根本出不了结果,仔细看Python的那些错误代码,原来一开始那个屌丝把原始数据都给我整没了一些,因为长度不对,所以整不出结果。我要用Excel的公式实现某些功能,的确噼里啪啦有好多个方案。有些方案一看就直接可以忽略,因为又长又臭,另外一些我感觉有些希望的却发现到Excel里面同样也是出不了结果。至于为什么我也不去纠结了,我直接去研究这些方法的思路到底是什么。我让它用Power Query,也就是M语言给我实现某个功能,结果发现把那堆代码贴到高级编辑器,甚至都无法按确定提交,因为显示语法错误。那个编辑器是一个神经的存在,说语法错误,但定位的那个点实际上没有问题,但那个问题到底在哪里,你得人肉上下文去找。我使用的通常是对半检索法,首先留一半,然后一半的一半。理论上是这么找的,但实际上后面某些功能不要我觉得都无所谓,所以我只要找到那些我需要的就可以了。最终发现,某个用了函数的地方,理论上应该是“=>”。DS给我的代码是“->”。如果这份代码是由图片识别过来的,出现这种等号变成减号,我觉得可以理解,但显然这种事情怎么可能发生?!对一个什么都不懂的人来说,你叫他怎么可能人肉找得出这样的低级错误呢?!那个代码除了那个等号变成了减号以外,最后的结果还有一些无厘头的数据合并,那些数据在前面几个步骤里面已经不复存在了,在最后那个步骤又突然间被提起,真牛逼!

在这种情况下,说AI可以取代人类完成编程,我觉得起码暂时是不行的,尤其是要实现一些高度定制的功能的时候。

FFmpeg 硬件加速小记

2025年10月13日 02:37

本文有 AI 参与编写。

什么是硬件加速?

硬件加速是指利用计算机中的专用硬件(如 GPU、专用编解码芯片)来执行视频编解码任务,而不是仅依赖 CPU 进行软件编码。相比纯软件编码,硬件加速具有以下优势:

  • 更快的处理速度:专用硬件针对视频编解码进行了优化,处理速度可以提升数倍
  • 更低的 CPU 占用:将负载转移到 GPU 或专用芯片,释放 CPU 资源
  • 更低的功耗:硬件编码通常比软件编码更节能,延长笔记本电脑续航时间

硬件加速的权衡

虽然硬件加速很快,但也有一些需要注意的地方:

  • 压缩效率略低:硬件编码器为了速度牺牲了一些压缩效率,相同质量下文件可能略大
  • 可控性较差:硬件编码器的参数调节选项通常少于软件编码器
  • 平台依赖性:不同平台和硬件支持的加速方式不同

主流硬件加速方案

1. VideoToolbox (macOS/iOS)

Apple 的硬件加速框架,支持 macOS 和 iOS 设备。

# 编码器
h264_videotoolbox
hevc_videotoolbox

# 使用示例
ffmpeg -i input.mp4 -c:v h264_videotoolbox -b:v 2M output.mp4

特点

  • 在 Apple Silicon (M1/M2/M3) 芯片上性能出色
  • 支持硬件加速的 H.264、HEVC、ProRes 编码
  • 低功耗,适合移动设备

2. NVENC (NVIDIA GPU)

NVIDIA GPU 内置的硬件编码器,从 GTX 600 系列开始支持。

# 编码器
h264_nvenc
hevc_nvenc
av1_nvenc  # RTX 40 系列及以上

# 使用示例
ffmpeg -hwaccel cuda -i input.mp4 -c:v h264_nvenc -preset p4 output.mp4

特点

  • 性能强劲,编码质量较好
  • 支持多路并行编码
  • 新一代显卡支持 AV1 编码

3. QuickSync (Intel 集成显卡)

Intel 集成显卡的硬件编码器,从第二代酷睿开始支持。

# 编码器
h264_qsv
hevc_qsv
av1_qsv  # 12 代及以上

# 使用示例
ffmpeg -hwaccel qsv -i input.mp4 -c:v h264_qsv -preset medium output.mp4

特点

  • 在没有独立显卡的情况下性能不错
  • 功耗低
  • 新一代处理器支持 AV1 编码

4. AMF (AMD GPU)

AMD GPU 的硬件编码器。

# 编码器
h264_amf
hevc_amf
av1_amf  # RX 7000 系列及以上

# 使用示例
ffmpeg -hwaccel amf -i input.mp4 -c:v h264_amf output.mp4

5. VAAPI (Linux)

Linux 上的通用硬件加速接口,支持 Intel、AMD 等多种硬件。

# 使用示例
ffmpeg -hwaccel vaapi -vaapi_device /dev/dri/renderD128 -i input.mp4 \
  -vf 'format=nv12,hwupload' -c:v h264_vaapi output.mp4

在 Python 中检测和使用硬件加速

下面是一个完整的 Python 实现,可以自动检测系统可用的硬件加速方式并选择最佳方案:

完整实现

import subprocess
import logging
from typing import Optional, Tuple

logger = logging.getLogger(__name__)


def get_hardware_encoder(use_hwaccel: bool = True) -> Tuple[str, Optional[dict]]:
    """
    检测可用的硬件加速器并返回合适的编码器设置。

    Args:
        use_hwaccel: 是否启用硬件加速

    Returns:
        (video_codec, hwaccel_options) 元组
        - video_codec: 编码器名称,如 'h264_videotoolbox'
        - hwaccel_options: 硬件加速选项字典,如 {'hwaccel': 'videotoolbox'}
    """
    if not use_hwaccel:
        return "libx264", None

    try:
        # 检查可用的硬件加速器
        hwaccel_result = subprocess.run(
            ["ffmpeg", "-hwaccels"],
            capture_output=True,
            text=True,
            timeout=5
        )
        hwaccels = hwaccel_result.stdout.lower()

        # 检查可用的编码器
        encoder_result = subprocess.run(
            ["ffmpeg", "-encoders"],
            capture_output=True,
            text=True,
            timeout=5
        )
        encoders = encoder_result.stdout.lower()

        logger.debug(f"Available hardware accelerators: {hwaccels}")
        logger.debug(f"Available encoders: {encoders}")

        def test_encoder(codec: str) -> bool:
            """测试编码器是否真正可用"""
            try:
                result = subprocess.run(
                    [
                        "ffmpeg",
                        "-f", "lavfi",           # 使用虚拟输入
                        "-i", "testsrc=duration=1:size=320x240:rate=1",
                        "-frames:v", "1",        # 只编码一帧
                        "-c:v", codec,           # 指定编码器
                        "-f", "null",            # 输出到空设备
                        "-"
                    ],
                    capture_output=True,
                    text=True,
                    timeout=10
                )
                return result.returncode == 0
            except Exception as e:
                logger.debug(f"Failed to test encoder {codec}: {e}")
                return False

        # 按优先级检测硬件编码器

        # 1. VideoToolbox (macOS/Apple Silicon)
        if "h264_videotoolbox" in encoders and "videotoolbox" in hwaccels:
            if test_encoder("h264_videotoolbox"):
                logger.info("Using VideoToolbox hardware acceleration")
                return "h264_videotoolbox", {"hwaccel": "videotoolbox"}

        # 2. NVIDIA NVENC
        if "h264_nvenc" in encoders:
            if test_encoder("h264_nvenc"):
                logger.info("Using NVIDIA NVENC hardware acceleration")
                if "cuda" in hwaccels:
                    return "h264_nvenc", {"hwaccel": "cuda"}
                return "h264_nvenc", None

        # 3. Intel QuickSync
        if "h264_qsv" in encoders and "qsv" in hwaccels:
            if test_encoder("h264_qsv"):
                logger.info("Using Intel QuickSync hardware acceleration")
                return "h264_qsv", {"hwaccel": "qsv"}

        # 4. AMD AMF
        if "h264_amf" in encoders and "amf" in hwaccels:
            if test_encoder("h264_amf"):
                logger.info("Using AMD AMF hardware acceleration")
                return "h264_amf", {"hwaccel": "amf"}

        # 5. VAAPI (Linux)
        if "h264_vaapi" in encoders and "vaapi" in hwaccels:
            if test_encoder("h264_vaapi"):
                logger.info("Using VAAPI hardware acceleration")
                return "h264_vaapi", {"hwaccel": "vaapi"}

    except Exception as e:
        logger.warning(f"Error checking hardware encoders: {e}")
        logger.info("Falling back to software encoding")

    # 回退到软件编码
    logger.info("Using software encoding (libx264)")
    return "libx264", None


def get_system_info() -> dict:
    """获取系统硬件加速信息"""
    try:
        # 获取 FFmpeg 版本
        version_result = subprocess.run(
            ["ffmpeg", "-version"],
            capture_output=True,
            text=True,
            timeout=5
        )

        # 获取硬件加速列表
        hwaccel_result = subprocess.run(
            ["ffmpeg", "-hwaccels"],
            capture_output=True,
            text=True,
            timeout=5
        )

        # 获取编码器列表(只提取硬件编码器)
        encoder_result = subprocess.run(
            ["ffmpeg", "-encoders"],
            capture_output=True,
            text=True,
            timeout=5
        )

        hw_encoders = []
        for line in encoder_result.stdout.split('\n'):
            if any(hw in line.lower() for hw in ['nvenc', 'qsv', 'videotoolbox', 'amf', 'vaapi']):
                hw_encoders.append(line.strip())

        return {
            "ffmpeg_version": version_result.stdout.split('\n')[0],
            "hwaccels": hwaccel_result.stdout,
            "hw_encoders": hw_encoders
        }
    except Exception as e:
        return {"error": str(e)}

使用示例

1. 检测系统信息

import json

# 获取系统硬件加速信息
info = get_system_info()
print(json.dumps(info, indent=2))

2. 在 ffmpeg-python 中使用

import ffmpeg

def encode_video_with_hwaccel(input_path: str, output_path: str, use_hwaccel: bool = True):
    """使用硬件加速编码视频"""

    # 获取硬件编码器
    vcodec, hw_options = get_hardware_encoder(use_hwaccel)

    # 创建输入流
    if hw_options:
        # 使用硬件加速解码
        stream = ffmpeg.input(input_path, **hw_options)
    else:
        stream = ffmpeg.input(input_path)

    # 配置输出
    stream = ffmpeg.output(
        stream,
        output_path,
        vcodec=vcodec,           # 使用检测到的编码器
        acodec='aac',            # 音频编码器
        video_bitrate='2M',      # 视频比特率
        audio_bitrate='192k',    # 音频比特率
        preset='medium',         # 编码预设(硬件编码器可能忽略此参数)
        **{'crf': '23'}          # 质量参数(硬件编码器可能忽略此参数)
    )

    # 执行编码
    ffmpeg.run(stream, overwrite_output=True)
    print(f"Video encoded successfully using {vcodec}")


# 使用硬件加速
encode_video_with_hwaccel('input.mp4', 'output.mp4', use_hwaccel=True)

# 强制使用软件编码
encode_video_with_hwaccel('input.mp4', 'output_sw.mp4', use_hwaccel=False)

不同平台的硬件加速检测

macOS

def detect_macos_hwaccel():
    """检测 macOS 硬件加速"""
    import platform

    if platform.system() != 'Darwin':
        return None

    # 检测芯片类型
    machine = platform.machine()
    is_apple_silicon = machine == 'arm64'

    # Apple Silicon 性能更好
    if is_apple_silicon:
        return {
            'platform': 'Apple Silicon',
            'recommended_encoder': 'h264_videotoolbox',
            'performance': 'excellent',
            'codecs': ['h264_videotoolbox', 'hevc_videotoolbox', 'prores_videotoolbox']
        }
    else:
        return {
            'platform': 'Intel Mac',
            'recommended_encoder': 'h264_videotoolbox',
            'performance': 'good',
            'codecs': ['h264_videotoolbox', 'hevc_videotoolbox']
        }

Windows

def detect_windows_hwaccel():
    """检测 Windows 硬件加速"""
    import platform

    if platform.system() != 'Windows':
        return None

    available = []

    # 检测 NVIDIA
    try:
        result = subprocess.run(
            ['nvidia-smi', '--query-gpu=name', '--format=csv,noheader'],
            capture_output=True,
            text=True,
            timeout=5
        )
        if result.returncode == 0:
            available.append({
                'type': 'NVIDIA',
                'encoder': 'h264_nvenc',
                'gpu': result.stdout.strip()
            })
    except:
        pass

    # 检测 Intel QuickSync(通过 FFmpeg)
    vcodec, _ = get_hardware_encoder(True)
    if 'qsv' in vcodec:
        available.append({
            'type': 'Intel QuickSync',
            'encoder': 'h264_qsv'
        })

    # 检测 AMD
    if 'amf' in vcodec:
        available.append({
            'type': 'AMD',
            'encoder': 'h264_amf'
        })

    return available

Linux

def detect_linux_hwaccel():
    """检测 Linux 硬件加速"""
    import platform
    import os

    if platform.system() != 'Linux':
        return None

    available = []

    # 检测 VAAPI 设备
    vaapi_devices = [f'/dev/dri/renderD{i}' for i in range(128, 140)]
    for device in vaapi_devices:
        if os.path.exists(device):
            available.append({
                'type': 'VAAPI',
                'device': device,
                'encoder': 'h264_vaapi'
            })
            break

    # 检测 NVIDIA
    try:
        result = subprocess.run(
            ['nvidia-smi'],
            capture_output=True,
            timeout=5
        )
        if result.returncode == 0:
            available.append({
                'type': 'NVIDIA',
                'encoder': 'h264_nvenc'
            })
    except:
        pass

    return available

性能对比和最佳实践

编码速度对比(参考数据)

以编码一个 1080p 60fps 视频为例:

编码器 相对速度 CPU 占用 质量评分
libx264 (软件) 1x 100% 10/10
h264_videotoolbox (M1) 5-8x 20% 8/10
h264_nvenc (RTX 3080) 8-12x 15% 8.5/10
h264_qsv (12 代 Intel) 4-6x 25% 7.5/10
h264_amf (RX 6800) 6-10x 20% 7.5/10

最佳实践

  1. 自动检测并回退

    • 始终先尝试硬件加速
    • 检测失败时自动回退到软件编码
    • 记录日志便于调试
  2. 选择合适的预设

    # NVENC 预设
    # p1 (fastest) -> p7 (slowest, best quality)
    stream = ffmpeg.output(stream, 'output.mp4', vcodec='h264_nvenc', preset='p4')
    
  3. 考虑批量处理

    • 硬件编码器通常支持多路并行
    • NVENC 可以同时处理多个视频流
  4. 监控编码质量

    • 硬件编码质量可能不如软件编码
    • 对质量要求高的场景考虑使用软件编码
    • 可以用 VMAF 等指标评估质量
  5. 处理兼容性问题

    def safe_encode(input_path, output_path):
        """带错误处理的编码"""
        try:
            # 尝试硬件加速
            encode_video_with_hwaccel(input_path, output_path, use_hwaccel=True)
        except Exception as e:
            logger.warning(f"Hardware encoding failed: {e}")
            logger.info("Retrying with software encoding")
            # 回退到软件编码
            encode_video_with_hwaccel(input_path, output_path, use_hwaccel=False)
    

调试技巧

查看详细的 FFmpeg 输出

def encode_with_debug(input_path, output_path):
    """启用详细日志的编码"""
    vcodec, hw_options = get_hardware_encoder(True)

    stream = ffmpeg.input(input_path, **hw_options) if hw_options else ffmpeg.input(input_path)
    stream = ffmpeg.output(stream, output_path, vcodec=vcodec)

    # 获取完整命令
    cmd = ffmpeg.compile(stream, overwrite_output=True)
    print(f"FFmpeg command: {' '.join(cmd)}")

    # 执行并查看输出
    try:
        ffmpeg.run(stream, overwrite_output=True, capture_stdout=False, capture_stderr=False)
    except ffmpeg.Error as e:
        print(f"stdout: {e.stdout.decode()}")
        print(f"stderr: {e.stderr.decode()}")
        raise

检查硬件支持

# 查看所有硬件加速方式
ffmpeg -hwaccels

# 查看所有编码器
ffmpeg -encoders | grep -E "(nvenc|qsv|videotoolbox|amf|vaapi)"

# 测试特定编码器
ffmpeg -f lavfi -i testsrc=duration=1:size=1920x1080:rate=30 \
  -c:v h264_videotoolbox -f null -

总结

硬件加速是视频处理中的重要优化手段,可以大幅提升处理速度和降低系统负载。通过自动检测和回退机制,我们可以构建一个跨平台的健壮视频处理系统。

关键要点:

  • 优先使用硬件加速,但保留软件编码作为回退方案
  • 不同平台选择对应的最佳硬件加速方式
  • 通过实际测试验证编码器可用性
  • 根据场景在速度和质量之间取得平衡

参考资源

Parquet 文件简介: Python 读写 Parquet 文件实战

Parquet 文件入门 Python 读写 Parquet 文件实战 大数据存储优化:Parquet 格式解析 Python 数据分析必备:Parquet 文件处理技巧 列式存储揭秘:Parquet 文件与性能优化 使用 Python 和 PyArrow 处理嵌套 Parquet 数据 从 CSV 到 Parquet:Python 数据格式转换教程

什么是 Parquet 文件?

Parquet 是一种列式存储文件格式,优化用于大规模数据处理。它常用于 Apache Spark、Hadoop 和 Pandas 等大数据框架,以实现高效存储和快速检索表格数据。 Parquet 格式可以简单认为是CSV的转置/Transpose。不过CSV是文本的,而Parquet是二进制的。从存储方式上理解列式存储就像把行列交换,但需要注意 Parquet 是二进制、支持压缩和嵌套类型,不仅仅是“转置”。

为什么使用 Parquet?

  • 列式存储:按列存储数据,提高分析任务的查询性能。
  • 压缩:支持高效的压缩技术,减少存储空间。
  • 兼容性:可与多种数据处理框架配合使用。
  • 模式演进:支持增加或删除列而不破坏现有数据。

安装所需库

要在 Python 中使用 Parquet,需要 pandaspyarrow(或 fastparquet):
pip install pandas pyarrow

在 Python 中读取 Parquet 文件

以下示例演示如何使用 pandaspyarrow 读取 Parquet 文件:
import pandas as pd
import pyarrow.parquet as pq

# Parquet 文件路径
file_path = "example.parquet"

# 读取 Parquet 文件到 DataFrame
df = pd.read_parquet(file_path)

# 显示前 5 行
print(df.head())

写入 Parquet 文件

你也可以轻松地将 DataFrame 保存为 Parquet 文件:
import pandas as pd

# 创建示例 DataFrame
data = {
    "name": ["Alice", "Bob", "Charlie"],
    "age": [25, 30, 35],
    "city": ["London", "Paris", "New York"]
}
df = pd.DataFrame(data)

# 保存为 Parquet
df.to_parquet("output.parquet", engine="pyarrow", index=False)

处理嵌套数据

Parquet 支持嵌套数据,如列表或结构体。可以使用 pyarrow 直接读取:
import pyarrow.parquet as pq
from io import BytesIO

# 直接读取 Parquet 文件
table = pq.read_table("example.parquet")
df = table.to_pandas()
print(df.head())

总结

Parquet 文件在存储和处理大规模表格数据时非常高效。使用 Python 的 pandaspyarrow,你可以轻松地读取、写入并处理 Parquet 文件,用于数据分析、ETL 流程和大数据应用。 [show_file file="/var/www/wp-post-common/justyy.com/python.php"] 英文:Introduction to Parquet Files: Read & Write using Python

相关文章:

  1. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  2. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  3. 第一次私校家长会: 原来家长比孩子还卷 前几天参加了娃的第一次家长会,和几位家长聊下来,真是个个都很厉害。不光孩子们卷,家长也一样卷,一眼望去基本都是 Dr/博士。娃还调侃我一句:“这有什么的,你不也是 Dr 吗?” 我心里默默想:还好没写学校名字,不然我这野鸡大学的头衔真拿不出手 😂。 私校里真是人才济济,乐器过 8 级的太常见了,卷得不得了。我还问过娃,是想当 big fish in a small pond...
  4. 如何通过二分查找搜索在区块链上根据时间戳定位区块? 前两天,我想查一下自己在 STEEM 区块链上一些重要记录对应的区块号,比如: 注册了我的账号 #4253590 成为见证人 #20190755 挖到我的第一个区块 #20390040 被孙宇晨大佬代理了 SP #41676911 收到一笔 DAO 收入...
  5. MySQL参数一键配置脚本: 有效提升数据库性能 我一直是自己租用VPS服务器,然后搭建各种服务,比如博客就是Apache2+MySQL数据库。一般来说就是默认参数,没有去管,不过最近发现MySQL的性能参数都很保守,不能发挥整个服务器的性能。 然后我就网上搜索了一下,根据参数配置建议,用ChatGPT写了以下Python和BASH脚本。只需要在需要优化的服务器上,跑一下该脚本,然后就会显示参数配置,然后直接把参数添加到MySQL数据库配置参数文件上: /etc/mysql/mysql.conf.d/mysqld.cnf 然后运行: service mysql restart 重启MySQL服务器。 运行了几周,发现效果很好,博客反应速度也快了很多,这很大原因是根据了内存增加了MySQL缓存大小。 Python脚本优化MySQL数据库参数 把下面的Python脚本存成 mysql_config.py 然后运行 python3 mysql_config.py...
  6. 英国抓捕比特币ATM主犯: 所有与法币挂钩的加密活动必须获得许可 英国查获比特币ATM主犯:所有与法币挂钩的加密业务必须持牌 案件回顾:比特币ATM运营者被判四年 在2025年2月,英国金融行为监管局(FCA)宣布成功起诉并判刑首位非法运营比特币ATM的个人——Olumide Osunkoya。该男子未经授权在伦敦多地运营加密ATM,处理交易金额达260万英镑。他曾试图注册合法业务但被拒,随后伪造身份文件绕过监管,最终被法院判处4年有期徒刑。 最新行动:7台ATM被查封,两人被捕 紧接着在2025年7月,FCA与伦敦警察再次联合行动,在西南伦敦多个地点查封7台非法加密ATM,并拘捕2人。FCA重申:在英国,没有任何加密ATM获得合法运营许可,所有涉及法币兑换的活动必须事先注册并获得批准。 英国FCA官网原文指出:“我们提醒所有经营者,若他们继续运营未注册的加密ATM,将面临刑事起诉。”(原文链接见参考资料) 为什么这些ATM是非法的? 在英国,只要涉及“加密货币 ↔ 法币”的兑换行为,就会被纳入《反洗钱条例(MLRs)》的监管框架。运营者必须: 向FCA注册为加密资产公司 实施KYC(身份验证)和AML(反洗钱)程序 接受FCA的持续监管与合规审核 未经注册即开展此类活动,属于违法行为。...
  7. 同一台服务器上多个WORDPRESS站点的一些设置可以移出去 我自从把所有网站都挪到一处VPS服务器上 就发现很多事情省事很多 可以同时管理多个网站 包括 WORDPRESS博客. 比如我有四个WORDPRESS博客 然后我就把通用的一些资料给移出去 移到 HTTP或者HTTPS都不能直接访问的文件夹里这样就更安全许多. 文件 wp-conn.php 存储了 相同的数据库资料. /** MySQL...
  8. 比特币最近波动有点大: 一天牛市一天熊 比特币10万美金以内都是最后上车的机会! 比特币近期的价格波动可以归因于多个关键因素,包括地缘政治动态、监管变化以及加密行业内的重大安全事件。其中一个主要影响因素是美国前总统唐纳德·特朗普对乌克兰和加密货币监管的立场变化。据报道,特朗普再次当选,他可能会推动减少美国对乌克兰的支持,这可能会影响全球金融市场和风险偏好。同时,特朗普正在将自己塑造为亲加密货币的候选人,表示有意让美国成为一个更加友好的加密货币环境。这一立场引发了市场对监管政策可能发生变化的猜测,导致市场情绪在乐观和不确定性之间波动。 特朗普对俄乌战争的态度 美国第43届总统唐纳德·特朗普已经在2025年1月当选并正式上任(第二次),那么他的政策可能会对比特币价格的波动产生更加直接和显著的影响。他政府对乌克兰和加密货币监管的立场已经不再是猜测,而是正在实际塑造市场的关键力量。 特朗普(Donald Trump)减少美国对乌克兰的支持,全球投资者可能会预期地缘政治稳定性发生变化,从而增加对比特币作为避险资产的需求。同时,他的亲加密货币立场可能正在推动市场的乐观情绪。如果他的政府推出有利于加密行业的监管政策,例如明确的合规指南或减少监管审查,可能会吸引更多机构投资者进入市场,并促进更广泛的加密货币采用。然而,政策的快速变化也可能导致短期市场剧烈波动,因为市场需要时间来消化新的政策动向。 朝鲜黑客盗取Bybit交易所15亿美元的ETH 另一个显著影响比特币价格的事件是近期涉及朝鲜黑客组织“Lazarus”的15亿美元以太坊被盗案件。据报道,Bybit交易所(全球第二)这些被盗的ETH已经被清洗,此次大规模黑客攻击引发了人们对加密行业安全性的担忧。此类安全事件不仅会削弱投资者信心,还可能引发更严格的监管审查,导致短期市场动荡。此外,被盗资金的大规模流动和出售可能对市场流动性造成冲击,进一步加大价格波动。随着这些事件的持续发酵,比特币价格正受到政治决策、监管预期以及安全挑战等多重因素的影响。 与此同时,与朝鲜黑客组织 Lazarus 相关的 15 亿美元以太坊被盗事件仍在影响加密市场。由于这些被盗 ETH 已被清洗,人们对加密行业安全漏洞的担忧持续存在,同时也可能引发更严格的监管审查。政治、监管和安全等多重因素交织在一起,共同导致了比特币近期的剧烈价格波动。...

数学之美: Sigma 函数的推导公式与 Python 实现

理解 Sigma 函数:因子、乘法性与公式推导

一文看懂 Sigma 函数:因子分解的终极威力! σ(n) 完全解析:为什么求和函数能“自动”变成乘积? 数学之美:Sigma 函数的推导、公式与 Python 实现 从几何级数到质因数:Sigma 函数的魔法公式大揭秘 搞懂 σ(n) 的那一天,我看到了数学的秩序 为什么 σ(n) = 乘积?带你走进数论的核心思想 Divisor 终极指南:Sigma 函数推导 + 代码 一篇搞定
Sigma 函数,记作 [math]\sigma(n)[/math],表示一个整数所有正因子的和。 例如 12 的因子有 1、2、3、4、6、12,因此 [math]\sigma(12)=28[/math]。 本文解释什么是 Sigma 函数、为什么它满足乘法性、如何从质因数分解推导出通用公式,并给出高效的 Python 实现。

可除性符号

在数论中,符号 “|” 表示“整除”。 [math]d \mid a \quad \Longleftrightarrow \quad \exists k \in \mathbb{Z},\; a = dk[/math] 因此表达式 [math]\sum_{d \mid n} d[/math] 的意思是“对所有能整除 n 的 d 求和”。

质因数分解与因子的结构

任意正整数 [math]n[/math] 都可以唯一写成: [math]n = p_1^{a_1} p_2^{a_2} \cdots p_k^{a_k}[/math] 它的一个因子必须从每个质数的指数中“选择”一个: [math]d = p_1^{e_1} p_2^{e_2} \cdots p_k^{e_k}, \qquad 0 \le e_i \le a_i[/math] 所有因子结构的规律都来自这个事实。

关键性质:Sigma 函数是乘法性的

当两个整数互质时,Sigma 函数满足: [math]\sigma(mn) = \sigma(m)\,\sigma(n) \qquad \text{if} \gcd(m,n)=1[/math] 原因是:若 [math]m[/math] 和 [math]n[/math] 的质因数互不相同, 那么 [math]mn[/math] 的每个因子都能唯一写成: [math]d = d_m d_n, \quad d_m \mid m, \; d_n \mid n[/math] 因此对所有因子求和可以写成二重求和: [math]\sigma(mn) = \sum_{d_m \mid m} \sum_{d_n \mid n} d_m d_n[/math] 接下来把二重求和“拆开”。固定某个 [math]d_m[/math],则: [math]\sum_{d_n \mid n} (d_m d_n) = d_m \sum_{d_n \mid n} d_n = d_m \sigma(n)[/math] 再对所有 [math]d_m[/math] 求和: [math]\sigma(mn) = \sum_{d_m \mid m} d_m \sigma(n) = \sigma(n) \sum_{d_m \mid m} d_m = \sigma(n)\sigma(m)[/math] 这就证明了 Sigma 的乘法性。

质数幂的 Sigma 公式

利用乘法性,只需计算 [math]\sigma(p^k)[/math]。 其因子为: [math]1, p, p^2, \ldots, p^k[/math] 这是一个几何级数: [math]\sigma(p^k) = 1 + p + p^2 + \cdots + p^k = \frac{p^{k+1} - 1}{p - 1}[/math] 把所有质因数幂的贡献相乘,就得到通用公式: [math]\sigma(n) = \prod_{i=1}^k \frac{p_i^{a_i+1} - 1}{p_i - 1}[/math] 这就是任意正整数的因子和公式。

示例:计算 σ(12)

质因数分解: [math]12 = 2^2 \cdot 3^1[/math] 分别计算: [math]\sigma(2^2) = 1 + 2 + 4 = 7[/math] [math]\sigma(3^1) = 1 + 3 = 4[/math] 相乘: [math]\sigma(12) = 7 \cdot 4 = 28[/math]

Python 实现:高效的 Sigma 函数

以下是基于质因数分解与乘法性的高效Python实现,时间复杂度约为 [math]O(\sqrt{n})[/math]。
def sigma(n: int) -> int:
    """高效计算因子和函数 σ(n)。"""
    total = 1
    x = n

    # 处理质因数 2
    count = 0
    while x % 2 == 0:
        x //= 2
        count += 1
    if count > 0:
        total *= (2 ** (count + 1) - 1) // (2 - 1)

    # 处理奇质数
    p = 3
    while p * p <= x:
        if x % p == 0:
            count = 0
            while x % p == 0:
                x //= p
                count += 1
            total *= (p ** (count + 1) - 1) // (p - 1)
        p += 2

    # 若剩下的是质数
    if x > 1:
        total *= (x**2 - 1) // (x - 1)

    return total

结语

Sigma 函数展示了因子结构的优雅与质因数分解的力量。通过理解乘法性与几何级数求和,我们得到一个漂亮的闭式公式,并能编写高效的计算程序。有了理论与代码,你就能深入探索更多数论中的算术函数了。 [show_file file="/var/www/wp-post-common/justyy.com/math.php"] 英文:Understanding the Sigma Function: Divisors, Multiplicativity, and the Formula

相关文章:

  1. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  2. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  3. 英国房子的EPC节能报告(Energe/Efficiency Performance Certificate) EPC (Energe/Efficiency Performance Certificate) 是英国房子的节能报告, 法律上规定, 每个房子都必须要有一个EPC报告, 报告的有效期为十年. 房东在把房子出租或者想卖房的时候, 这个EPC就必须有效, 在一些情况下 比如出租房子的时候, 这个EPC报告还必须符合一些最低标准, 比如房子必须满足 F档(类似及格线)...
  4. 第一次私校家长会: 原来家长比孩子还卷 前几天参加了娃的第一次家长会,和几位家长聊下来,真是个个都很厉害。不光孩子们卷,家长也一样卷,一眼望去基本都是 Dr/博士。娃还调侃我一句:“这有什么的,你不也是 Dr 吗?” 我心里默默想:还好没写学校名字,不然我这野鸡大学的头衔真拿不出手 😂。 私校里真是人才济济,乐器过 8 级的太常见了,卷得不得了。我还问过娃,是想当 big fish in a small pond...
  5. Python 有序数据结构完整指南(Sorted Containers) 有序数据结构在编程中(尤其是算法竞赛和竞技编程)非常实用。在 Python 中,主要由 Sorted Containers 库提供三种有序数据结构:SortedDict、SortedSet 和 SortedList。 深入理解 Python 有序数据结构:从内置到 SortedContainers Python 有序数据结构完整指南 Python...
  6. 如何通过二分查找搜索在区块链上根据时间戳定位区块? 前两天,我想查一下自己在 STEEM 区块链上一些重要记录对应的区块号,比如: 注册了我的账号 #4253590 成为见证人 #20190755 挖到我的第一个区块 #20390040 被孙宇晨大佬代理了 SP #41676911 收到一笔 DAO 收入...
  7. 北爱尔兰的黑暗树篱 Dark Hedges 是摄影的取景之地 老实说, 去北爱尔兰当天我才了解到黑暗树篱这个地方(Dark Hedges), 因为都是媳妇做的功课, 日程安排上了, 我当上司机, 然后被普及了知识. 北爱尔兰的黑暗树篱是我们访问北爱尔兰的第一站, 从机场开车过去大概50分钟(黑暗树篱在机场的北面40英里左右). 黑暗树篱 Dark Hedges地址: Bregagh Rd, Stranocum,...
  8. 一张图告诉你北京的雾霾有多严重 一北京的朋友朋友圈发的: 左上为全新口罩;右上为全新口罩本周一到周五每天室外戴20分钟左右;左下为全新口罩今早室外+公交车戴一个半小时;右下为全新口罩今早开车戴一小时左右. 还有这图 空气污染 – 红色的是严重的.中国,尤其是华北地区,是全球最红的地区,没有”之一”. 本文一共 113 个汉字, 你数一下对不对. 一张图告诉你北京的雾霾有多严重. (AMP 移动加速版本) 赞赏我的几个理由. ¥...

用这三货做数据查询

2025年11月22日 08:02

不知道从什么时候开始,我就迷上了数据查询。

一开始只是想实现某个功能,后来发现原来实现同样东西,我用不同方法都可以做到。哪个方法更直观简便一些?我感觉Excel VBA的SQL,Power Query以及Python相比,就数据处理的方便性来说Python是碾压的,但我没有发现Python的巨大优势。问题可能在我交给Python处理的数据太少了,跟其它两个相比体现不出Python的高效。在控制Excel单元格格式方面,Python天生不如office自家的VBA。为什么我会把PQ跟VBA跟Python相比呢?是因为从Office 2019开始,PQ就算是内置的一个功能。VBA里面的SQL天生有缺陷,因为跟真正的数据库SQL相比,那就是个阉割版,有些你觉得明明可以实现的东西,在Excel VBA里好像就真没有直接的解决方案,为什么居然会这样呢?

到现在为止,我依然没有发现Excel VBA的SQL有直接的文本拼接功能。其它数据库的SQL里,那就是一个很简单的函数。Excel VBA的SQL在合并其他数据方面没问题,但一旦遇到需要进行文本拼接。我感觉除非在查询结束以后再做一个字符串的字典,否则无解。或许你会说其实我也可以直接在Excel的函数层面做这个拼接,因为用textjoin函数实际上是能实现那个功能的,但关键是如果数据比较多,既然我都在VBA里完成前面的所有,为什么最后的功能又要回归到函数呢?二者的运算速度不是一个层次的。每当我遇到文本拼接,我知道SQL是撞墙的,所以我就直接想到PQ。

PQ可以做数据分组,做文本拼接直接在高级编辑器里修改就能实现,但关键是实际上可以不用PQ,我不想用那个玩意,使用可能会有点慢还行,如果要进入到里面编写代码,那个小窗口字体无法放大,简直要逼死我这种老花。更作死的是,很多时候提醒我错误,但错误根本不发生在提醒的那个地方,不断的嵌套括号、逗号、又或者不小心带入的中文标点符号都会导致错误,找茬的过程让人挺绝望。我觉得,我还是喜欢在VBA里用SQL,其实无非就是判断加循环。在PQ里我总觉得有些很容易就能做到的事情,但是它非得用一些看上去很复杂的函数去实现。比如要根据A字段去决定B字段的数值是正数还是负数,在SQL里,一句很简单的iif就能实现,但在PQ里,你还得新建一个条件列,把条件写进去,接着把原来那个数值列删掉,再把条件列的名称改成数值列。当然你也可以直接使用replacevalue函数,但据说那个东西的执行效率反倒不如新增一列再删除一列。PQ里的函数非常多,嵌套用起来的方法更是让你眼花缭乱,也正是因为那些杂七杂八的东西太多了,反而让我觉得不如SQL简单干脆。让我很绝望的是,Access的SQL可以直接文本拼接,但Excel里的就不行,虽然二者是同一个版本的office。

当我在一个问题上钻研得越深,我就越能理解到高中时候,我的数学老师说学习数学的几个境界:不懂不会,会而不对,对而不全,全而不好。

为什么并行不是无限的: 简单解释 Amdahl vs Gustafson

Amdahl 定律 vs Gustafson 定律 — 完整教程、推导、应用场景及 Python 绘图

Amdahl 定律 vs Gustafson 定律:完整教程、推导、应用场景及 Python 绘图 理解并行加速:通过代码讲解 Amdahl 定律和 Gustafson 定律 并行计算基础:Amdahl 定律、Gustafson 定律及加速建模 并行加速原理:Amdahl 和 Gustafson 定律完整指南 并行扩展解析:推导并比较 Amdahl 和 Gustafson 定律 Amdahl vs Gustafson:并行加速完整指南(含 Python 代码) 并行性能建模:Amdahl 定律、Gustafson 定律及实际应用 学习并行加速:数学、直觉、应用场景及 Python 可视化 并行计算:必须掌握的两条定律(Amdahl & Gustafson) 工程师的并行加速:Amdahl 定律、Gustafson 定律及 Python 实现 从理论到代码:用 Amdahl 和 Gustafson 建模并行加速 实用并行加速指南:Amdahl 定律、Gustafson 定律及可视化 为什么并行不是无限的:简单解释 Amdahl vs Gustafson 并行加速真相:Amdahl 限制 vs Gustafson 扩展 并行计算神话与现实:Amdahl 和 Gustafson 的教训

引言

并行计算在现代计算中至关重要:多核 CPU、GPU、分布式集群、云工作负载、LLM 训练以及 HPC 模拟。 为了分析程序在更多处理器下能加速多少,主要有两种数学模型:
  • Amdahl 定律 — 固定规模工作负载的性能
  • Gustafson 定律 — 可扩展规模工作负载的性能
这两条定律并不矛盾,它们回答的是 不同的问题。 本教程涵盖推导、直觉、比较、实际应用场景,以及展示两条定律的 Python 绘图脚本。

1. 什么是加速比?

加速比衡量程序在 N 个处理器上运行速度提升多少: [math]S(N) = \frac{T_1}{T_N}[/math] 如果程序在一个处理器上运行 10 秒,两处理器运行 5 秒,则加速比为: [math]S(2) = \frac{10}{5} = 2[/math] 完美线性加速为: [math]S(N) = N[/math] 但实际系统存在串行瓶颈,这正是 Amdahl 定律和 Gustafson 定律描述的内容。

2. Amdahl 定律(固定工作量)

2.1 直觉

Amdahl 假设:
  • 总工作量保持 不变
  • 部分工作是串行的,无法并行化
设:
  • f = 串行比例
  • 1 - f = 可并行比例

2.2 推导

一个处理器的运行时间: [math]T_1 = T_s + T_p[/math] 定义: [math]f = \frac{T_s}{T_1}[/math] 因此: [math]T_s = fT_1[/math] [math]T_p = (1 - f)T_1[/math] N 个处理器的运行时间: [math]T_N = fT_1 + \frac{(1 - f)T_1}{N}[/math] 加速比: [math] S(N) = \frac{T_1}{T_N} = \frac{1}{f + \frac{1 - f}{N}} [/math] 其中 f 是串行工作比例,[math] 1-f [/math] 是可并行工作。Amdahl 公式也可以写成: [math] S(N) = \frac{T_1}{T_N} = \frac{1}{(1-p) + \frac{p}{N}} [/math] 其中 [math] p=1-f [/math],[math] f=1-p [/math]

2.3 当 N → ∞ 时的极限

[math]S(\infty) = \frac{1}{f}[/math] 如果串行比例为 10%(f = 0.1): [math]S_\infty = 10[/math] 即使处理器无限,也无法超过该值。

2.4 Amdahl 定律的实际应用场景

Amdahl 适合优化固定任务的 延迟
  • GPU 内核优化固定张量大小
  • 单次请求推理延迟降低
  • 视频编码、压缩、排序
  • 加速固定批量作业
  • 数据库查询加速

3. Gustafson 定律(可扩展工作量)

3.1 直觉

Gustafson 反过来问: “增加处理器,我能在相同时间内解决多大的问题?” 这反映了真实 HPC 工作负载:更多 CPU → 更高分辨率 → 更大模拟。

3.2 推导

假设程序在 N 个处理器上运行 1 个时间单位。 设:
  • f = 串行比例(按规模测量)
可并行部分随处理器数量扩展,因此其运行时间保持与 N 成比例。 一个处理器的时间: [math]T_1 = f + N(1 - f)[/math] 加速比: [math]S(N) = f + N(1 - f)[/math] Gustafson 公式的 “N 减” 形式: [math]S(N) = N - (N - 1)f[/math] 或者,如果定义并行比例 [math]p = 1 - f[/math],公式也可写为: [math]S(N) = f + N(1-f) = f + Np [/math] “N 减” 形式用 p 表示: [math] S(N) = N-(N-1)f = N - (N-1)(1-p) [/math]

3.3 解释

随着 N 增加,加速比趋近于: [math]S(N) \approx N(1 - f)[/math] 对于小串行比例,几乎呈线性增长。

3.4 Gustafson 定律的实际应用场景

Gustafson 适用于 吞吐量扩展 或可增加问题规模的工作负载:
  • 天气和气候模拟
  • 粒子模拟、CFD、有限元分析
  • LLM 训练:更多 GPU → 更长序列或更大模型
  • 大数据分析(Spark, Dask, Flink)
  • 蒙特卡洛模拟

4. Amdahl 定律 vs Gustafson 定律(比较表)

项目AmdahlGustafson
工作负载固定随 N 扩展
目标降低延迟增加吞吐量
加速比上限有界: [math]1/f[/math]近似线性: [math]N(1-f)[/math]
悲观/乐观悲观乐观
应用场景优化现有任务扩展大规模工作量

5. 实际应用场景(综合视角)

Amdahl(延迟优化)

  • 减少单次 LLM 查询推理时间
  • 加速数据库 join 操作
  • 固定张量 GPU 内核优化
  • 视频编码(相同视频)

Gustafson(吞吐量 / 扩展)

  • LLM 训练(扩展至更多 GPU)
  • 高分辨率天气模型模拟
  • 大数据 ETL 扩展
  • 科学 HPC 工作负载

6. Python 绘图脚本(显示两条定律)

下面代码生成 Amdahl 与 Gustafson 加速比曲线图。 可以调整 f(串行比例)和处理器数量 N。 脚本绘制两条曲线在同一张图上。 包括部分 [math]f[/math] 的值,例如串行部分: import numpy as np import matplotlib.pyplot as plt def amdahl_speedup(N, s): return 1.0 / (s + (1 - s) / N) def gustafson_speedup(N, s): return s + (1 - s) * N # Number of processors N = np.arange(1, 65) # Serial fractions to consider Serial = [0.05, 0.1, 0.2, 0.3, 0.5, 0.8, 0.9, 1.0] plt.figure(figsize=(10, 6)) for f in Serial: plt.plot(N, amdahl_speedup(N, f), linestyle='-', label=f"Amdahl Serial={f}") plt.plot(N, gustafson_speedup(N, f), linestyle='--', label=f"Gustafson Serial={f}") plt.title("Amdahl's Law") plt.xlabel("Number of Processors (N)") plt.ylabel("Speedup") plt.legend() plt.grid(True) plt.tight_layout() plt.savefig("parallel-speedup-amdahl-vs-gustafson.png") ## plt.show() 下面是 Amdahl 与 Gustafson 曲线图示。 [caption id="attachment_70445" align="alignnone" width="1000"]Amdahl 定律加速曲线 Amdahl 定律加速曲线[/caption] [caption id="attachment_70446" align="alignnone" width="1000"]Amdahl vs Gustafson 加速曲线 Amdahl vs Gustafson 加速曲线[/caption] [caption id="attachment_70447" align="alignnone" width="1000"]Gustafson 定律加速曲线 Gustafson 定律加速曲线[/caption]

图示解读

  • Amdahl 曲线迅速趋于平缓——受串行部分限制。
  • Gustafson 曲线几乎线性上升——适用于可扩展工作负载。
  • 串行比例 f 越高,两种模型差距越大。

结论

Amdahl 定律展示了固定工作负载下的并行 上限,适合延迟优化。Gustafson 定律展示了随工作负载扩展的并行 潜力
  • Amdahl 定律 → 固定规模工作负载 → 收益递减
  • Gustafson 定律 → 可扩展工作负载 → 近似线性加速
  • 结合使用理解硬件极限与算法特性
  • Python 工具使可视化直观易懂
它们共同构成现代并行系统性能分析基础,从 HPC 到 LLM 训练,再到 GPU 计算。 英文:The Truth About Parallel Speedup: Amdahl’s Limits vs Gustafson’s Scaling

相关文章:

  1. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  2. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  3. 力扣刷题获得一件衣服奖励(Leetcode DCC Winner) 我每天都在力扣上刷题。力扣有国服和美服,我两边都会打卡。每天打卡可以获得积分,而积分可以兑换各种礼物,比如T恤、卫衣、水壶,甚至可以用来抵扣一个月的会员费用。 我从2018年8月开始刷题找工作(当时去伦敦面试亚马逊),从那时起每年都会续费会员,费用是159美元,相当于每月13.25美元。我觉得这是对自己最值得的投资。买了力扣会员,就会有动力刷题、思考,通过不断练习让自己熟能生巧,保持一定的竞争力。 到目前为止,我已经用积分兑换了7-8件力扣的衣服,其中有2-3件是卫衣。国内的礼物我都寄到姐姐家。 前不久,我收到了力扣的邮件,说我获得了DCC奖励。我也不知道为什么会获得这个奖,随手回了邮件。没多久,就收到了一件新版的力扣衬衫。 英文:Leetcode DCC Winner T-shirt 本文一共 291 个汉字, 你数一下对不对. 力扣刷题获得一件衣服奖励(Leetcode DCC Winner)....
  4. 第一次私校家长会: 原来家长比孩子还卷 前几天参加了娃的第一次家长会,和几位家长聊下来,真是个个都很厉害。不光孩子们卷,家长也一样卷,一眼望去基本都是 Dr/博士。娃还调侃我一句:“这有什么的,你不也是 Dr 吗?” 我心里默默想:还好没写学校名字,不然我这野鸡大学的头衔真拿不出手 😂。 私校里真是人才济济,乐器过 8 级的太常见了,卷得不得了。我还问过娃,是想当 big fish in a small pond...
  5. 如何通过二分查找搜索在区块链上根据时间戳定位区块? 前两天,我想查一下自己在 STEEM 区块链上一些重要记录对应的区块号,比如: 注册了我的账号 #4253590 成为见证人 #20190755 挖到我的第一个区块 #20390040 被孙宇晨大佬代理了 SP #41676911 收到一笔 DAO 收入...
  6. 花钱让人换汽车钥匙的电池真是个智商税 今天想不到我这么聪明的人也被人狠狠的收了一把智商税. 今天被收智商税了, 去 Tesco 换车钥匙的电池. . 才发现如此的简单, 那人直接2分钟搞定2个, 然后收了我25英镑. . 服了. . 我还以为很复杂…… 网友说 “1....
  7. 比特币最近波动有点大: 一天牛市一天熊 比特币10万美金以内都是最后上车的机会! 比特币近期的价格波动可以归因于多个关键因素,包括地缘政治动态、监管变化以及加密行业内的重大安全事件。其中一个主要影响因素是美国前总统唐纳德·特朗普对乌克兰和加密货币监管的立场变化。据报道,特朗普再次当选,他可能会推动减少美国对乌克兰的支持,这可能会影响全球金融市场和风险偏好。同时,特朗普正在将自己塑造为亲加密货币的候选人,表示有意让美国成为一个更加友好的加密货币环境。这一立场引发了市场对监管政策可能发生变化的猜测,导致市场情绪在乐观和不确定性之间波动。 特朗普对俄乌战争的态度 美国第43届总统唐纳德·特朗普已经在2025年1月当选并正式上任(第二次),那么他的政策可能会对比特币价格的波动产生更加直接和显著的影响。他政府对乌克兰和加密货币监管的立场已经不再是猜测,而是正在实际塑造市场的关键力量。 特朗普(Donald Trump)减少美国对乌克兰的支持,全球投资者可能会预期地缘政治稳定性发生变化,从而增加对比特币作为避险资产的需求。同时,他的亲加密货币立场可能正在推动市场的乐观情绪。如果他的政府推出有利于加密行业的监管政策,例如明确的合规指南或减少监管审查,可能会吸引更多机构投资者进入市场,并促进更广泛的加密货币采用。然而,政策的快速变化也可能导致短期市场剧烈波动,因为市场需要时间来消化新的政策动向。 朝鲜黑客盗取Bybit交易所15亿美元的ETH 另一个显著影响比特币价格的事件是近期涉及朝鲜黑客组织“Lazarus”的15亿美元以太坊被盗案件。据报道,Bybit交易所(全球第二)这些被盗的ETH已经被清洗,此次大规模黑客攻击引发了人们对加密行业安全性的担忧。此类安全事件不仅会削弱投资者信心,还可能引发更严格的监管审查,导致短期市场动荡。此外,被盗资金的大规模流动和出售可能对市场流动性造成冲击,进一步加大价格波动。随着这些事件的持续发酵,比特币价格正受到政治决策、监管预期以及安全挑战等多重因素的影响。 与此同时,与朝鲜黑客组织 Lazarus 相关的 15 亿美元以太坊被盗事件仍在影响加密市场。由于这些被盗 ETH 已被清洗,人们对加密行业安全漏洞的担忧持续存在,同时也可能引发更严格的监管审查。政治、监管和安全等多重因素交织在一起,共同导致了比特币近期的剧烈价格波动。...
  8. 和媳妇约个会: 剑桥的过桥米线 Dumpling Trees Dumpling Trees 是位于剑桥 Cherry Hilton 附近的一家中式餐厅,以云南特色的过桥米线闻名。店内环境宽敞整洁,菜品丰富,除了经典的米线,还有各类小吃、烧烤和炒饭,味道地道,分量十足。过桥米线的汤底鲜香,配料新鲜,包括鸡肉、鱿鱼、虾等食材,顾客可以自己下锅涮熟,既好吃又有趣。餐厅提供免费停车,但需在店内登记车牌,适合家庭聚餐或周末小聚。 剑桥 Cherry Hilton 那边有一家叫 Dumpling Trees 的过桥米线店,两三年前的冬天我们去吃过一次(剑桥 Dumpling Tree...

用 Python 学强化学习: Q-Learning 迷宫示例

[caption id="attachment_70386" align="alignnone" width="2017"]Q Learning强化学习算法(机器学习/人工智能) Q Learning强化学习算法(机器学习/人工智能)[/caption] 强化学习(Reinforcement Learning, RL)是一种让智能体/Agent通过与环境交互、试错学习来获得最优行为策略的机器学习方法。本文用一个简单的 Q-learning 迷宫示例,帮助你快速理解强化学习的基本原理。

强化学习入门:从试错中学习的艺术 Reinforcement Learning 101: The Art of Learning by Trial and Error 深度解析强化学习:Q-Learning算法详解 Deep Dive into Reinforcement Learning: Understanding the Q-Learning Algorithm 机器如何学会自己做决定?强化学习告诉你答案 How Do Machines Learn to Make Their Own Decisions? Reinforcement Learning Explained 从奖励中学习:人工智能的“试错智慧” Learning from Rewards: The Trial-and-Error Intelligence Behind AI

一、什么是强化学习?

强化学习的世界中包含五个关键要素:
  • Agent(智能体):做决策、执行动作的主体
  • Environment(环境):智能体所处的世界
  • State(状态):当前环境的描述
  • Action(动作):智能体可采取的操作
  • Reward(奖励):环境反馈,用来衡量动作的好坏
智能体的目标是学习一个策略 π(a|s),让它在每个状态下选择最优动作,从而获得最大的累积奖励。 [math]J(\pi) = \mathbb{E}\pi \left[ \sum{t=0}^{\infty} \gamma^t r_t \right][/math] 其中 [math]\gamma[/math](0 ≤ [math]\gamma[/math] ≤ 1)是折扣因子,用于衡量未来奖励相对于即时奖励的重要程度。

二、Q-Learning 原理

Q-learning 是最经典的强化学习算法之一。它通过学习一个 Q 表(Q-table)来记录每个“状态-动作”对的价值。 更新公式如下: [math] Q(s,a) \leftarrow Q(s,a) + \alpha [r + \gamma \max_{a'} Q(s', a') - Q(s,a)] [/math] 其中:
  • [math] \alpha [/math]:学习率(Learning Rate)
  • [math] \gamma [/math]:折扣因子(Discount Factor)
  • [math] r [/math]:奖励(Reward)
  • [math] s' [/math]:下一状态(Next State)

三、迷宫环境设计

定义一个 3×5 的迷宫
  • 0:空地
  • -1:墙
  • 1:出口(目标)

四、完整 Python 实现代码


import numpy as np
import random

# 1️⃣ 定义迷宫
maze = np.array([
    [0,  0,  0, -1,  1],
    [0, -1,  0, -1,  0],
    [0,  0,  0,  0,  0]
])

n_rows, n_cols = maze.shape
actions = ['up', 'down', 'left', 'right']
Q = np.zeros((n_rows, n_cols, len(actions)))

# 2️⃣ 超参数
alpha = 0.1
gamma = 0.9
epsilon = 0.1
episodes = 500

# 3️⃣ 辅助函数
def is_valid(state):
    r, c = state
    return 0 <= r < n_rows and 0 <= c < n_cols and maze[r, c] != -1

def next_state(state, action):
    r, c = state
    if action == 'up': r -= 1
    elif action == 'down': r += 1
    elif action == 'left': c -= 1
    elif action == 'right': c += 1
    return (r, c)

def get_reward(state):
    r, c = state
    if maze[r, c] == 1: return 10
    elif maze[r, c] == -1: return -1
    return -0.1

# 4️⃣ 训练循环
for episode in range(episodes):
    state = (2, 0)
    done = False

    while not done:
        if random.uniform(0, 1) < epsilon:
            action_idx = random.randint(0, len(actions)-1)
        else:
            action_idx = np.argmax(Q[state[0], state[1]])

        action = actions[action_idx]
        next_s = next_state(state, action)

        if not is_valid(next_s):
            reward = -1
            next_s = state
        else:
            reward = get_reward(next_s)

        Q[state[0], state[1], action_idx] += alpha * (
            reward + gamma * np.max(Q[next_s[0], next_s[1]]) - Q[state[0], state[1], action_idx]
        )

        state = next_s
        if maze[state[0], state[1]] == 1:
            done = True

print("✅ 训练完成!")

# 5️⃣ 查看学到的路径
state = (2, 0)
path = [state]

while maze[state[0], state[1]] != 1:
    action_idx = np.argmax(Q[state[0], state[1]])
    next_s = next_state(state, actions[action_idx])
    if not is_valid(next_s) or next_s in path:
        break
    state = next_s
    path.append(state)

print("🗺️ 学到的路径:", path)

五、运行结果

运行上面的代码后,你会看到类似输出: ✅ 训练完成! 🗺️ 学到的路径: [(2, 0), (2, 1), (2, 2), (1, 2), (0, 2), (0, 3), (0, 4)] 这说明智能体成功学会了走出迷宫 🎯

六、总结

强化学习使机器能够通过反馈学习最优策略,这类似于人类通过经验学习的方式。 Q-Learning 是许多现代强化学习算法的基础,包括深度 Q 网络(Deep Q-Networks, DQN)。 这个简单的示例展示了完整的强化学习循环:探索 → 反馈 → 改进。
  • Q 表:保存每个状态-动作的价值
  • ε-greedy 策略:平衡探索与利用
  • 奖励函数设计:引导智能体形成目标导向行为
  • 强化学习思想:通过试错和奖励反馈不断改进策略
强化学习的魅力在于,它不需要显式答案,而是让机器自己“摸索”出最优策略。你可以在此基础上继续扩展,比如加入 matplotlib 动画可视化 或使用 神经网络(Deep Q-Learning) 解决更复杂的任务。 英文:How Do Machines Learn to Make Their Own Decisions? Reinforcement Learning Explained

相关文章:

  1. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  2. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  3. 第一次私校家长会: 原来家长比孩子还卷 前几天参加了娃的第一次家长会,和几位家长聊下来,真是个个都很厉害。不光孩子们卷,家长也一样卷,一眼望去基本都是 Dr/博士。娃还调侃我一句:“这有什么的,你不也是 Dr 吗?” 我心里默默想:还好没写学校名字,不然我这野鸡大学的头衔真拿不出手 😂。 私校里真是人才济济,乐器过 8 级的太常见了,卷得不得了。我还问过娃,是想当 big fish in a small pond...
  4. 给孩子第一台NUC小电脑 Next Unit of Computing Next Unit of Computing (NUC) is a line of small-form-factor computers...
  5. 和媳妇约个会: 剑桥的过桥米线 Dumpling Trees Dumpling Trees 是位于剑桥 Cherry Hilton 附近的一家中式餐厅,以云南特色的过桥米线闻名。店内环境宽敞整洁,菜品丰富,除了经典的米线,还有各类小吃、烧烤和炒饭,味道地道,分量十足。过桥米线的汤底鲜香,配料新鲜,包括鸡肉、鱿鱼、虾等食材,顾客可以自己下锅涮熟,既好吃又有趣。餐厅提供免费停车,但需在店内登记车牌,适合家庭聚餐或周末小聚。 剑桥 Cherry Hilton 那边有一家叫 Dumpling Trees 的过桥米线店,两三年前的冬天我们去吃过一次(剑桥 Dumpling Tree...
  6. 微信PC端程序占用了1.39 TB的空间! 快速清理微信占用空间 前两天我的 C 盘剩余空间突然变红了,我随手一查,竟然发现微信 PC 端程序居然占用了 1.39 TB 的空间,简直不可思议。在手机上,微信同样是名列前茅的“吞空间大户”,在 设置 → 通用 → 手机存储空间 里几乎稳居第一。 更离谱的是,这些空间大多并不是因为聊天记录,而是各种缓存文件、视频、图片和被动接收的文件所堆积起来的。平时我们只是点开看一眼,就算没保存下来,微信也会悄悄把它们留在本地,占据大量磁盘。尤其是群聊里转发的视频和文件,日积月累就成了一个“隐形黑洞”。...
  7. C++的左值/lvalue, 右值/rvalue和右值引用/rvalue references C++ 左值(lvalue)、右值(rvalue)与右值引用(rvalue reference) 理解 C++ 中的左值、右值及其引用形式,是掌握现代 C++(尤其是 C++11 以后的移动语义/move和完美转发/perfect forwarding)必不可少的基础。 📌 什么是左值(lvalue) 左值指的是有名字、可寻址的对象,通常可以出现在赋值语句的左侧。 int x...
  8. 比特币最近波动有点大: 一天牛市一天熊 比特币10万美金以内都是最后上车的机会! 比特币近期的价格波动可以归因于多个关键因素,包括地缘政治动态、监管变化以及加密行业内的重大安全事件。其中一个主要影响因素是美国前总统唐纳德·特朗普对乌克兰和加密货币监管的立场变化。据报道,特朗普再次当选,他可能会推动减少美国对乌克兰的支持,这可能会影响全球金融市场和风险偏好。同时,特朗普正在将自己塑造为亲加密货币的候选人,表示有意让美国成为一个更加友好的加密货币环境。这一立场引发了市场对监管政策可能发生变化的猜测,导致市场情绪在乐观和不确定性之间波动。 特朗普对俄乌战争的态度 美国第43届总统唐纳德·特朗普已经在2025年1月当选并正式上任(第二次),那么他的政策可能会对比特币价格的波动产生更加直接和显著的影响。他政府对乌克兰和加密货币监管的立场已经不再是猜测,而是正在实际塑造市场的关键力量。 特朗普(Donald Trump)减少美国对乌克兰的支持,全球投资者可能会预期地缘政治稳定性发生变化,从而增加对比特币作为避险资产的需求。同时,他的亲加密货币立场可能正在推动市场的乐观情绪。如果他的政府推出有利于加密行业的监管政策,例如明确的合规指南或减少监管审查,可能会吸引更多机构投资者进入市场,并促进更广泛的加密货币采用。然而,政策的快速变化也可能导致短期市场剧烈波动,因为市场需要时间来消化新的政策动向。 朝鲜黑客盗取Bybit交易所15亿美元的ETH 另一个显著影响比特币价格的事件是近期涉及朝鲜黑客组织“Lazarus”的15亿美元以太坊被盗案件。据报道,Bybit交易所(全球第二)这些被盗的ETH已经被清洗,此次大规模黑客攻击引发了人们对加密行业安全性的担忧。此类安全事件不仅会削弱投资者信心,还可能引发更严格的监管审查,导致短期市场动荡。此外,被盗资金的大规模流动和出售可能对市场流动性造成冲击,进一步加大价格波动。随着这些事件的持续发酵,比特币价格正受到政治决策、监管预期以及安全挑战等多重因素的影响。 与此同时,与朝鲜黑客组织 Lazarus 相关的 15 亿美元以太坊被盗事件仍在影响加密市场。由于这些被盗 ETH 已被清洗,人们对加密行业安全漏洞的担忧持续存在,同时也可能引发更严格的监管审查。政治、监管和安全等多重因素交织在一起,共同导致了比特币近期的剧烈价格波动。...
❌