记忆碎片之python多线程、线程安全、GIL锁、local()对象

Python 进程和线程详解(daemon/non-daemon/join/threading.local) Python 进程和线程详解1、进程和线程概念2、线程的状态3、Python中的进程和线程3.1 Python的线程开发3.2 Thread 类3.2.1 线程创建、启动3.2.2 线程退出、线程传参3.2.3 `threading`的属性和方法3.2.3 `Thread`实例的属性和方法4、start() 和 run() 的区别和联系4.1 示例 14.2 示例 24.3 示例 34.4 示例 45、多线程6、线程安全问题6.1 `print`线程不安全6.2 改进`print`打印6.3 使用`logg 阅读详情
创建多线程的方式
方式一:通过Thread创建多线程 函数式
方式二:通过继承Thread类创建多线程 class类

多线程和多进程之间区别
多进程是多份程序同时执行
多线程是在一份程序下多个执行指针同时执行
多线程并不需要线程间通信,线程间共享全局变量,进程间不共享全局变量
进程是系统进行资源分配和调度的一个独立单位,线程是进程的一个实体,是CPU调度和分派的基本单位,
它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
线程的划分尺度小于进程(资源比进程少),使得多线程程序的并发性高。
进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率
且线程不能够独立执行,必须依存在进程中
线程执行开销小,但不利于资源的管理和保护,而进程正相反

from threading import Thread, ThreadError, Timer
import time


# 函数式
def wuzhe(dj):
    print("键盘上的舞者_" + dj)
    time.sleep(1)


# if __name__ == '__main__':
#     start_time = time.perf_counter()
#     for _ in range(5):
#         t = Thread(target=wuzhe, args=("DJ",))
#         t.start()
#     end_time = time.perf_counter()
#     print(f"程序耗时{(end_time - start_time).__round__(10)}")

#
# class类
class Wuzhe(Thread):
    def __init__(self, **kwargs):
        super(Wuzhe, self).__init__()
        self.goods = kwargs["goods"]

    def run(self):  # 名字必须定义为run,否则不会运行
        for i in range(3):
            time.sleep(1)
            print(f"当前是{self.name}在运行{str(i)},买的商品为{self.goods}")


def test():
    for j in range(5):
        t = Wuzhe(goods="馒头")
        t.start()


# if __name__ == '__main__':
#     test()
# 线程在执行过程中,如果中途执行sleep时,线程就会进入到阻塞的状态,当sleep结束之后,线程进入到就绪转台,等待
# 调度而线程调度将自行选择一个线程执行

# 线程之间共享全局变量
num = 100


def work1():
    global num
    for i in range(3):
        num += 1
    print(f"当前执行的是work1,num的值是{num}")


def work2():
    global num
    for i in range(3):
        num += 1
    print(f"当前执行的是work2,num的值是{num}")


# if __name__ == '__main__':
#     print("准备创建线程")
#     t1 = Thread(target=work1)
#     t1.start()
#     time.sleep(1)
#     t2 = Thread(target=work2)
#     t2.start()
#     print("over")
# 输出结果为:
# 准备创建线程
# 当前执行的是work1,num的值是103
# 当前执行的是work2,num的值是106over
# 说明:
# 在一个进程内的所有线程共享全局变量,能够在不适用其他方式的前提下完成多线程之间的数据共享(这点要比多进程要好)
# 缺点就是,线程是对全局变量随意遂改可能造成多线程之间对全局变量的混乱(即线程非安全)

# 线程不安全
nums = 0


def wuzhe1():
    global num
    for i in range(1000000):
        num += 1
    print(f"当前执行的是wuzhe1,num的值是{num}")


def wuzhe2():
    global num
    for i in range(1000000):
        num += 1
    print(f"当前执行的是wuzhe2,num的值是{num}")


# if __name__ == '__main__':
#     print("准备创建线程")
#     t1 = Thread(target=wuzhe1)
#     t1.start()
#     # time.sleep(3)
#     t2 = Thread(target=wuzhe2)
#     t2.start()
#     print("over", num)
# time.sleep(3)没有注释时
# 准备创建线程
# 当前执行的是wuzhe1,num的值是1000100
# over 1024274
# 当前执行的是wuzhe2,num的值是2000100
# time.sleep(3) 注释时
# 准备创建线程
# over 163934
# 当前执行的是wuzhe1,num的值是1178561
# 当前执行的是wuzhe2,num的值是1323692
# 没有控制多个线程对同一资源的访问,对数据造成破坏,使得线程运行的结果不可预期 ,这种现象就是线程不安全。

# 避免线程不安全
from threading import Lock

num_1 = 0


def wuzhe3():
    global num_1
    for i in range(1000000):
        # True表示堵塞 即如果这个锁在上锁之前已经被上锁了,那么这个线程会在这里一直等待到解锁为止
        # False表示非堵塞,即不管本次调用能够成功上锁,都不会卡在这,而是继续执行下面的代码
        mutexFlag = mutex.acquire(True)
        if mutexFlag:
            num_1 += 1
            mutex.release()
    print(f"当前执行的是wuzhe3,num的值是{num_1}")


def wuzhe4():
    global num_1
    for i in range(1000000):
        mutexFlag = mutex.acquire(True)
        if mutexFlag:
            num_1 += 1
            mutex.release()
    print(f"当前执行的是wuzhe4,num的值是{num_1}")


# if __name__ == '__main__':
#     print("准备创建线程")
#     # 创建一个互斥锁对象
#     # 加锁确保了某段关键代码只能由一个线程从头到尾完整地执行,
#     # 但是阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,
#     # 效率就大大地下降了,由于可以存在多个锁,不同的线程持有不同的锁,并试图获取对方持有的锁时,可能会造成死锁
#     mutex = Lock()
#     t1 = Thread(target=wuzhe3)
#     t1.start()
#     # time.sleep(3)
#     t2 = Thread(target=wuzhe4)
#     t2.start()
#     print("over", num_1)
# time.sleep(3)没有注释
# 准备创建线程
# 当前执行的是wuzhe3,num的值是1000000
# over 1005606
# 当前执行的是wuzhe4,num的值是2000000
# time.sleep(3)注释
# 准备创建线程
# over 31644
# 当前执行的是wuzhe3,num的值是1909435
# 当前执行的是wuzhe4,num的值是2000000

# 死锁
# 在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同事等待对方的资源,就会造成死锁
class Wuzhe1(Thread):
    def run(self) -> None:
        if mutexA.acquire():
            print(self.name + "----do1---up----")
            time.sleep(1)
            if mutexB.acquire():
                print(self.name + "----do1---down----")
                mutexB.release()
            mutexA.release()


class Wuzhe2(Thread):
    def run(self) -> None:
        if mutexB.acquire():
            print(self.name + "----do1---up----")
            time.sleep(1)
            if mutexA.acquire():
                print(self.name + "----do1---down----")
                mutexA.release()
            mutexB.release()


mutexA = Lock()
mutexB = Lock()
# if __name__ == '__main__':
#     t1 = Wuzhe1()
#     t2 = Wuzhe2()
#     t1.start()
#     t2.start()

# 可以通过生产者与消费者模型来解决线程的同步和线程的安全
# 使用队列,队列实现来锁原理(原子性操作,要么不搞,要么就搞完),通过使用队列来实现线程间的同步
from queue import Queue


# 生产者
class Producer(Thread):
    def run(self) -> None:
        global queue
        count = 0
        while True:
            if queue.qsize() < 1000:
                for i in range(100):
                    count += 1
                    info = "生产产品" + str(count)
                    queue.put(info)
                    print(info)
            time.sleep(0.5)


# 消费者
class Consumer(Thread):
    def run(self) -> None:
        global queue
        while True:
            if queue.qsize() > 100:
                for i in range(3):
                    info = self.name + "消费了" + queue.get()
                    print(info)
            time.sleep(1)


# if __name__ == '__main__':
#     queue = Queue()
#     # 这个阻塞队列就是用来给生产者和消费者解耦的
#     for i in range(500):
#         queue.put("初始产品" + str(i))
#     for p1 in range(2):
#         p = Producer()
#         p.start()
#     for c1 in range(5):
#         c = Consumer()
#         c.start()

# 使用全局变量但是不添加锁
from threading import local, current_thread


def process_student():
    # 获取当前线程关联的student:
    std = local_school.student
    print('Hello, %s (in %s)' % (std, current_thread().name))


def process_thread(name):
    # 绑定ThreadLocal的student:
    local_school.student = name
    process_student()


local_school = local()
# if __name__ == '__main__':
#     t1 = Thread(target=process_thread, args=('键盘',), name='Thread-A')
#     t2 = Thread(target=process_thread, args=('舞者',), name='Thread-B')
#     t1.start()
#     t2.start()
#     t1.join()
#     t2.join()
# 输出:
# Hello, 键盘 (in Thread-A)
# Hello, 舞者 (in Thread-B)
# 全局变量local_school就是一个local()对象,每个Thread对它都可以读写student属性,但互不影响。
# 你可以把local_school看成全局变量,但每个属性如local_school.student都是线程的局部变量,
# 可以任意读写而互不干扰,也不用管理锁的问题,local()内部会处理。
# 可以理解为全局变量local_school是一个dict,不但可以用local_school.student,还可以绑定其他变量,如local_school.teacher等等。
# local()最常用的地方就是为每个线程绑定一个数据库连接,HTTP请求,用户身份信息等,
# 这样一个线程的所有调用到的处理函数都可以非常方便地访问这些资源。
# 一个local()变量虽然是全局变量,但每个线程都只能读写自己线程的独立副本,互不干扰。
# local()解决了参数在一个线程中各个函数之间互相传递的问题

# 同步调用和异步调用
# 同步调用就是你喊你朋友吃饭,你朋友在忙,你就一直在那等,等你朋友忙完了 ,你们一起去。
# 异步调用就是你喊你朋友吃饭,你朋友说知道了,待会忙完去找你 ,你就去做别的了。

from multiprocessing import Pool
import os


def wuzhe3():
    print(f"进程池中的进程{os.getpid()},父id为{os.getppid()}")
    for i in range(3):
        print(f"------{i}-----")
        time.sleep(1)
    return "hello"


def wuzhe4(args):
    print(f"------------回调函数-----pid===={os.getpid()}")
    print(f"------------回调函数-----参数===={args}")


# if __name__ == '__main__':
#     pool = Pool()
#     pool.apply_async(func=wuzhe3, callback=wuzhe4)
#     time.sleep(5)
#     print(f"主进程的pid为---{os.getpid()}")
    # 这里的callback是由主进程执行的,当子进程死亡,主进程回调函数。

# GIL锁
# Python全局解释锁(GIL)简单来说就是一个互斥体(或者说锁),这样的机制只允许一个线程来控制Python解释器。
# 这就意味着在任何一个时间点只有一个线程处于执行状态。
# 所以在python中多线程是假的,因为在执行过程中CPU中只有一个线程在执行。
# 当你使用多进程时,你的效率是高于多线程的。
# Python GIL经常被认为是一个神秘而困难的话题,但是请记住作为一名Python支持者,
# 只有当您正在编写C扩展或者您的程序中有计算密集型的多线程任务时才会被GIL影响。

Python运行时真相:字节码、GIL与内存的硬核解剖 Python常被笼统归类为‘解释型动态语言’,但其真实执行模型是源码编译为字节码后由Python虚拟机(PVM)解释执行——这决定了性能瓶颈不在语法层,而在CPython运行时开销。GIL并非线程安全的保障,而是一个保护字节码原子执行的互斥锁,对用户数据、C扩展及外部资源完全无约束;内存管理也远非‘全自动’,引用计数、分代回收与pymalloc内存池共同构成易被误判的复杂系统。理解字节码指令(如LOAD_FAST vs LOAD_GLOBAL)、GIL在pthread_mutex_t层面的物理存在,以及Py 阅读详情

相关推荐

Python多核并发真相:GIL本质、子解释器实战与3.13可用路径

Python并发能力受限于其内存管理模型,核心瓶颈并非简单的全局解释器锁(GIL),而是引用计数机制与单解释器进程架构的双重约束。理解GIL作为安全护栏而非性能缺陷的本质,是突破多核困局的前提;CPython 3.13通过稳定化Subinterpreters(子解释器)、增强free-threaded构建支持及引入t-string等底层改进,首次提供了可落地的轻量级隔离计算方案。这些特性不依赖虚幻的‘Python 3.14’,而是面向真实高并发场景——如FastAPI服务吞吐提升、Dask单机加速、实时风控

weixin_30275415的博客 412

python 全局变量_python线程之五:本地对象(local)全局变量对比理解

1、本地对象(local)理解:线程本地数据的管理这个对象可以随意增加和使用属性作为全局对象,不同的线程,local 内属性是独立的,无法多线程共享2、使用场景:线程内属性很多时,可以用local对象来存储线程内有一类属性,可以用local对象来存储3、local 的对象方法:from threading import locall = local() # 创建一个本地对象# 设置属性(随便设置...

weixin_39742471的博客 455

Python机器人短期与长期记忆架构实战

在构建具备连续交互能力的AI机器人时,记忆系统是核心基础设施。短期记忆(STM)负责维持会话上下文与任务状态,依赖线程局部存储与细粒度生命周期管理;长期记忆(LTM)则需支持语义检索、结构化持久化与隐私合规,通常结合向量数据库(如Chroma)与加密存储实现。二者协同的关键在于意图识别、数据流转协议与物理隔离设计,避免性能雪崩与语义失焦。该架构广泛应用于IoT中控、智能客服、数字助理等强调‘上下文连续性’的工程场景,尤其适合边缘部署与数据主权敏感环境。

weixin_30394669的博客 450

掌握Python并发编程:线程安全的秘诀

在多线程环境中编程时,确保操作的线程安全是至关重要的,特别是当涉及到共享资源如Python中的容器类型(list、set、dict)及其他共享数据结构时。本文通过探讨Python的线程模型、线程安全的基本概念,以及深入分析容器类型在多线程应用中的线程安全操作,提供了一系列的实际案例分析和代码示例,旨在帮助开发者理解和实现线程安全的多线程编程。Python线程是操作系统级别的线程,这意味着Python的多线程是由操作系统调度的,能够实现真正的并行计算,但在解释器级别受到了GIL的限制。此外,Python的。

walkskyer的博客 2271

Python数据结构选型实战:时间、空间与线程安全的动态权衡

Python数据结构并非简单的语法工具,而是底层C实现、内存模型与运行时机制共同作用的结果。理解list的动态扩容策略、dict的开放寻址哈希表、deque的块状内存管理,是规避O(n)退化、内存爆炸和GC压力的前提。在真实系统中,选型本质是在时间复杂度、内存占用、可读性与线程安全性之间做场景化权衡——例如高并发订单状态同步需避开list.remove()的线性查找,传感器时序数据应优先采用array.array降低80%内存开销。本文基于支付网关、实时风控等高并发生产案例,结合perf火焰图、timeit

aoanping0730的博客 314

Python高级进阶:从对象模型、内存布局到执行调度的底层认知

Python高级能力的本质,不在于掌握更多语法糖,而在于理解其对象模型、内存管理机制与执行调度原理。作为动态语言,Python通过引用计数与分代垃圾回收协同工作,对象创建、属性访问、协程切换等行为均受字节码指令(如INPLACE_ADD、GEN_SEND)和C层结构体(如PyListObject)严格约束。深入`__slots__`可重构实例内存布局,`weakref`能打破循环引用实现精准生命周期控制,`gc`模块则提供观测与干预回收过程的能力。这些技术共同支撑高并发、低延迟、内存可控的生产级服务——尤其

481

解决Python多线程中的线程安全问题

在Python的多线程编程中,线程安全是一个至关重要的问题。由于Python的全局解释器锁(GIL)的存在,Python的线程在某些情况下可能并不如预期那样并行执行,但即便如此,线程安全问题依然需要得到妥善的处理。如果两个线程同时修改同一个变量的值,那么最终的结果可能是不确定的,取决于操作系统如何调度这两个线程。由于队列是线程安全的,我们不需要在使用它们时添加额外的锁来保护数据。为了避免数据竞争和其他线程安全问题,我们需要确保对共享资源的访问是原子的,或者在访问共享资源时使用适当的同步机制。

weixin_71166183的博客 1286

Python列表拼接的6种方法:性能、内存与工程选择

列表拼接(concatenate lists)是Python中最基础却极易误用的核心操作,其本质涉及对象可变性、内存分配策略与时间复杂度差异。理解`list`作为动态数组的底层行为,是区分`+`(创建新列表,O(n+m)空间)、`extend()`(原地追加,零额外内存)、`+=`(语法糖但语义明确)、`itertools.chain`(惰性迭代,O(1)内存)等方案的关键。在数据采集、日志聚合、ETL流水线等真实场景中,错误选型会导致内存暴涨、GC停顿甚至多线程数据错乱。本文聚焦Python中真正可用、可

weixin_30753873的博客 310

python——线程同步和线程安全

python线程安全和线程同步

iamballer77的博客 1075

Rust-Python互操作实战:零成本抽象提升性能与稳定性

Rust-Python互操作是一种融合两种语言优势的现代系统集成范式,其核心在于利用Rust的内存安全与零成本抽象能力,弥补Python在CPU密集、低延迟及高并发场景下的GIL限制与ABI不稳定性。技术原理上,通过PyO3等绑定工具实现无缝类型映射与生命周期管理,避免C扩展的手动引用计数和Cython的语法幻觉,在保障安全性的同时达成接近原生C的执行效率。该方案显著提升数据处理、异步I/O、数值计算与密码学等关键模块的可预测性与生产稳定性,特别适用于Pandas加速、FastAPI后端优化及FIPS合规加

tyygming的专栏 354

Samba架构解析:后Transformer时代的计算-记忆-调度协同范式

大语言模型的注意力机制正面临内存带宽、缓存污染与编译失效率三重瓶颈,推动业界从‘堆参数’转向‘精调度’的架构演进。Samba作为TAI #104报告重点推荐的后Transformer架构,其核心并非简单稀疏化Attention,而是将模型执行建模为有限状态自动机,实现计算、记忆与调度的物理解耦。该设计显著降低长上下文(如128K)推理的显存占用与端到端延迟,同时保持对HuggingFace生态的高度兼容,特别适用于金融风控、法律合同审查、客服对话等需高精度长程依赖建模的工业场景。

weixin_30825199的博客 374

[特殊字符] Local Moondream2性能调优:本地环境下吞吐量提升技巧

本文介绍了如何在星图GPU平台上自动化部署🌙 Local Moondream2镜像,实现高效图像理解与描述生成。通过平台一键部署,用户可快速构建本地视觉对话服务,典型应用于电商商品图批量解析、AI绘画提示词自动生成等场景,显著提升多图处理吞吐量与稳定性。

weixin_35516273的博客 341

腾讯大佬总结的170道 python面试题

简述基于 TCP 协议的套接字通信流程。19.面向对象中`__new__` 和 `__init__` 区别。86. 解释 Python 中的`//`,`%`和`**`运算符。45.isinstance 的作用以及与 type()的区别。3. 简述下 Python 中的字符串、列表、元组和字典。143. 如何高效的找到 redis 中的某个 KEY。140. 如何保证 redis 中的数据都是热点数据。147. redis 中的 watch 的命令的作用。108. 简述 进程、线程、协程的区别以及应用场景。

AudiA6LV6的博客 486

基于Appium与pytest构建多设备并发自动化测试框架实战

在移动应用测试领域,自动化测试是提升效率和保障质量的关键技术。其核心原理是通过脚本模拟用户操作,对应用功能进行验证。这项技术的核心价值在于能够快速、重复地执行测试用例,显著缩短回归测试周期,并提高测试覆盖率。随着移动设备碎片化加剧,兼容性测试成为巨大挑战,传统串行测试效率低下,无法满足敏捷开发需求。因此,多设备并发测试技术应运而生,它通过并行执行策略,将测试时间压缩至单设备耗时,极大提升了测试效能。该技术广泛应用于需要覆盖多种机型、系统版本的移动应用测试场景,特别是在CI/CD流水线中实现快速反馈。本文聚焦

weixin_34296641的博客 410

ESP8266 进行HDLC解码,AX.25,APRS

/************************************************************** 函数名:aprs_wait_begin() 参 数:无 返回值:bool true=得到合法脉冲,false=未得到 说 明:等待第1个833us高脉冲,判断范围 730-930,其他忽略 ***************************************************************/ bool aprs_wait_begin(){ stati

蓝蓝的博客 1625

BEVFormer vs BEVFusion:5个关键差异点帮你选对环视感知方案

本文深入对比了自动驾驶领域两大主流环视感知方案BEVFormer与BEVFusion。BEVFormer作为纯视觉BEV感知的标杆,通过注意力机制隐式学习深度,成本较低;而BEVFusion作为多模态融合典范,融合激光雷达与摄像头数据,在性能、小目标检测及极端环境鲁棒性上优势显著。文章从计算效率、部署成本、数据依赖性等五个核心维度提供选型指南,帮助技术决策者根据自身算力预算与传感器配置做出明智选择。

weixin_29306011的博客 123

Appium多设备并发测试框架:基于Python多线程与pytest的实战指南

在移动应用开发中,自动化测试是保障软件质量的关键环节。其核心原理是通过脚本模拟用户操作,对应用功能进行验证。随着移动设备碎片化加剧,单设备串行测试效率低下,无法满足快速迭代的需求。多设备并发测试技术应运而生,它通过并行执行测试用例,大幅缩短测试周期,实现对不同型号、系统版本设备的快速兼容性验证,从而提升测试覆盖率和交付效率。这一技术尤其适用于需要频繁回归测试的敏捷团队。本文聚焦于利用Appium、pytest和Python多线程,构建一个稳定高效的**多设备并发**自动化测试框架,详细拆解从环境搭建、核心模

weixin_33946605的博客 377

打开UG会安装报错:initialization internal ERROR 的提示框,提示line 1344 of错误的解决方案

打开UG会安装报错:initialization internal ERROR 的提示框,提示line 1344 of错误的解决方案

Q82556499的博客 3520

抛弃 OpenClawd吧!我用 Go 打造了企业级 Swarm(蜂群)agent,更智能,更安全、性能快 5 倍、成本直降80%

AuraMate 不是终点,而是一个起点。它证明了,通过合理的架构设计(Swarm)和认知建模(IKTS),我们完全可以用现有的 LLM 构建出远超 Chatbot 水平的智能体。我们相信,未来的公司里,人类员工和数字员工的比例将达到 1:10 甚至更高。AuraMate 正在为此打造基础设施。如果你是开发者,欢迎加入我们的社区,一起定义数字员工的标准。如果你是企业管理者,欢迎尝试 AuraMate,让它成为你最得力的助手。项目地址与资源官网下载开发者文档(全文完)

xsdick的博客 1035

FreeRTOS任务调度实战:如何让STM32同时处理温湿度采集、OLED显示和云端通信

本文通过一个基于STM32的物联网终端项目,详细讲解了如何利用FreeRTOS实现多任务调度,同时处理温湿度采集、OLED显示和云端通信。文章深入探讨了任务规划、堆栈分配、信号量与消息队列等核心机制,并重点优化了ESP8266通信任务的非阻塞设计与稳定性,为构建响应迅速、运行可靠的嵌入式系统提供了实战指南。

weixin_29188043的博客 331

多重共线性问题 -- 岭回归方法

概述 本篇博客分为三大部分,线性模型、多重共线性问题和岭回归。其中,线性模型中介绍了线性模型定义和普通最小二乘法对线性模型的拟合。第二部分,借由1987-2007年的人口、消费和科技对碳排放的影响的数据来说明多重共线性问题(包括如何从定性和定量两个方面判断多重共线性问题)和多重共线性问题对普通最小二乘估计的影响。第三部分,使用岭回归对第二部分中的多重共线性问题进行拟合,并基于R2R^2R2决定系数...

楚江客的记录 1万+

Python空列表底层原理与工程实践指南

空列表([])是Python中最基础却最易被误解的容器类型,其本质并非‘不存在’,而是遵循容器协议、具备完整对象生命周期的零状态结构。它通过__bool__协议实现隐式真值判断,依赖ob_size字段和预分配内存机制保障性能与安全性。在工程实践中,空列表直接影响默认参数行为、并发安全、类型提示语义及内存效率。理解其CPython底层实现(如PyListObject结构、BUILD_LIST字节码)和协议边界(如可被子类重载),是编写健壮、高性能、可维护代码的关键前提。本文深入解析空列表在真实系统中的典型陷阱

dingdi3021的博客 446

形式化方法(Formal Methods)和人工智能(Artificial Intelligence)

一、形式化方法(Formal Methods) ​ 形式化方法最初应用在硬件上,验证硬件的正确性,后面逐渐应用到软件编程中,能够在软件中找到软件的错误,验证软件的安全可靠。形式化方法更加接近离散数学,所以其应用难度非常大,同时学习成本也较高。再加上形式化方法的大多数理论还停留在上个世纪,由于程序越来越复杂,导致形式化方法进行验证需要大量人工和时间,以至于现在绝大部分软件开发人员完全没有考虑过这个方法,甚至没有听说过这个名词。 ​ 形式化方法最新的应用成果是在工业上,比如一些极其重要且对安全性要求极高的领域(

qq_37030400的博客 4004

Python数据结构实战:从问题诊断到性能决策

数据结构是程序性能的底层基石,其本质是根据读写比例、数据规模和操作类型,在时间与空间代价间做出工程权衡。理解列表、字典、堆、双端队列等内置结构的原理与适用边界,远比手写算法更重要;而`heapq`、`collections.deque`、`array.array`等标准库组件,正是CPython针对真实场景深度优化的技术结晶。它们支撑着电商库存扣减、日志高频统计、实时推荐向量、消息优先级调度等典型应用。本文聚焦Python工程实践中的结构选型逻辑,融合Data-structures and Algorith

347

PyTorch实战(21)——扩散模型(Diffusion Model)

扩散模型通过简单的噪声扩散过程,就能创造出高质量的超现实图像。在本节中,我们首先学习了扩散如何用于图像生成,了解了扩散模型的内部运作机制。随后基于动漫图像数据集,使用 PyTorch 和 Hugging Face 框架训练和运行自定义扩散模型,生成逼真动漫图像。

盼小辉丶的博客 3336

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

用Rust构建AI Agent长期记忆系统:解决LLM上下文限制的轻量级方案

在AI应用开发中,大语言模型(LLM)的上下文窗口限制是构建智能Agent时面临的核心挑战。LLM基于固定长度的上下文窗口进行推理,当对话内容超出窗口边界时,早期信息会被丢弃,导致Agent在长对话中出现“失忆”现象。为解决这一问题,长期记忆系统应运而生,它通过信息编码、向量检索和记忆融合等技术,为Agent提供跨越多个会话的连贯认知能力。这类系统在智能客服、个性化助手、知识管理等场景中具有重要价值。本文聚焦于一个用Rust编写的轻量级长期记忆库,该库通过**结构化记忆提取**和**高效向量检索**,仅用约

weixin_30613343的博客 296

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

上一篇: 记忆碎片之python多进程、进程池和消息队列
下一篇: 记忆碎片之python线程池、submit()、done()、result()、wait()、as_completed()、map()方法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值