当前位置: 首页 > news >正文

python概念详解

1.is和==有什么区别?

在 Python 中,is和''都用于比较,但它们的比较对象和逻辑完全不同,核心区别在于:is比较的是 “对象身份”(是否为同一个对象),''比较的是 “对象值”(是否相等)。
  • is:比较的是两个对象的id值是否相等,也就是比较俩对象是否为同一个实例对象。是否指向同一个内存地址。
  • == : 比较的两个对象的内容/值是否相等,默认会调用对象的eq()方法。

2.解释python中的GIL锁

在 Python 中,GIL(Global Interpreter Lock,全局解释器锁)是 CPython 解释器(Python 最常用的官方实现)中的一个核心机制,它本质上是一个互斥锁(mutex),作用是确保同一时刻只有一个线程在执行 Python字节码。

GIL对多线程的影响
GIL 的存在直接影响了 Python 多线程的执行效率,具体表现因任务类型而异:

  1. CPU 密集型任务(如大量计算)
  • 多线程效率低下:由于 GIL 限制,即使在多核 CPU 上,多个线程也无法并行执行 Python 字节码,只能 “交替执行”(同一时刻只有一个线程占用 CPU)。
  • 线程切换会带来额外开销(如保存 / 恢复线程状态),因此多线程可能比单线程更慢。例如,用多线程计算斐波那契数列,实际速度可能不如单线程。
  1. I/O 密集型任务(如网络请求、文件读写)
  • 多线程有效:当线程执行 I/O 操作(如等待网络响应、磁盘读写)时,会主动释放 GIL,让其他线程有机会执行。
  • 因此,多线程可以在等待 I/O 的间隙利用 CPU,提高整体效率(比如多线程并发爬取网页)。
    关键误区:GIL 不是 Python 的 “语言特性”
  • GIL 是CPython 解释器的实现细节,而非 Python 语言本身的限制。其他 Python 解释器(如 Jython、IronPython)没有 GIL,它们可以利用多线程实现真正的并行。
  • 但由于 CPython 是最主流的解释器(默认安装的 Python 就是 CPython),因此通常说的 “Python GIL” 其实特指 CPython 的 GIL。

如何绕过 GIL?

如果需要利用多核 CPU 处理 CPU 密集型任务,可以通过以下方式绕过 GIL:
  1. 多进程(multiprocessing模块):
    每个进程有独立的 Python 解释器和内存空间,各自拥有独立的 GIL,因此可以在多核上并行执行。缺点是进程间通信成本较高(需通过队列、管道等)。
  2. C 扩展:
    耗时的计算逻辑用 C/C++ 实现(通过Cython或ctypes调用),在 C 扩展中释放 GIL,允许 Python 线程和 C 线程并行。
  3. 异步编程(asyncio):
    基于单线程的事件循环,通过非阻塞 I/O 处理并发,避免线程切换开销(适合 I/O 密集型任务)。

总结

  • GIL 是 CPython 的全局互斥锁,确保同一时刻只有一个线程执行 Python 字节码。
  • 对 CPU 密集型任务,多线程受 GIL 限制无法并行,效率低;对 I/O 密集型任务,多线程可通过释放 GIL 提高效率。
  • 绕过 GIL 的主流方式是多进程(利用多核)或异步编程(优化 I/O 并发)。

3.解释__new__和__init__的区别。

  • 在 Python 中,__new__和__init__都是类的特殊方法(魔术方法),但它们的作用和调用时机完全不同,核心区别在于:__new__负责创建对象,__init__负责初始化对象。
  1. 作用与调用时机:
    new:是一个类方法(第一个参数为类本身cls),在对象被创建之前调用,用于创建并返回一个类的实例。它是实例的 “创建者”,决定是否创建新实例、创建什么样的实例(甚至可以返回其他类的实例)。
    init:是一个实例方法(第一个参数为实例本身self),在对象被创建之后调用,用于初始化实例的属性(如给实例绑定变量、设置初始值)。它是实例的 “初始化者”,仅负责对已创建的实例进行配置,不参与实例的创建过程。
  2. 参数与返回值:
  • new:第一个参数必须是cls(表示当前类),后续参数与类的构造参数一致(即创建实例时传入的参数);必须返回一个实例对象(通常是cls的实例,也可以是其他类的实例)。如果返回None或非当前类的实例,__init__方法不会被调用。
  • init:第一个参数必须是self(表示已创建的实例),后续参数与__new__的参数一致(由__new__传递而来);没有返回值(若返回非None值,会抛出TypeError)。
http://www.hskmm.com/?act=detail&tid=36072

相关文章:

  • JAVA基础理解
  • 1279. 红绿灯路口
  • 软件工程第三次作业
  • 用户消费行为数据分析(随笔)
  • linux常用命令总结
  • sqlserver 主要的日期函数及用法示例
  • ICPC2022沈阳 游记(VP)
  • 大数据分析基础及应用案例:第四周学习报告——线性回归模型
  • 「LG7446-rfplca」题解
  • 图论刷题记录
  • 「LG6596-How Many of Them」题解
  • 骗我呢
  • 手写体识别
  • 你好,我是肆闲:C语言的学习,成长与分享旅程
  • AGC 合集 1.0
  • 20231302邱之钊密码系统设计实验一第二
  • 深入BERT内核:用数学解密掩码语言模型的工作原理
  • ZR 2025 NOIP 二十连测 Day 6
  • 20251021
  • [论文笔记] Precision-Guided Context Sensitivity for Pointer Analysis
  • 英语_备忘_疑难
  • 数学题刷题记录(数学、数论、组合数学)
  • 朋友圈文案不会写?这个AI指令可能帮得上忙
  • 「JOISC2020-掃除」题解
  • 结对作业
  • CF简单构造小计
  • 深入认识ClassLoader - 一次投产失败的复盘
  • python 包来源镜像
  • CSharp基础复习-1
  • Linux7种文件类型