python慢的原因

🐢python慢的原因

前言

相比C/C++/JAVA, Python确实慢,在一些特殊场景下,Python比C++慢100~200倍由于速度慢的原因,很多公司的基础架构代码依然用C/C++开发比如各大公司阿里/腾讯/快手的推荐引擎\搜索引擎、存储引擎等底层对性能要求高的模块。

原因

  • 是动态类型语言,变解释变运行:

    • C与C++运行的时候要先进行编译,编译成为可以直接生成运行效率高的机械码,可以看到每次运行都生成了.exe
    • python执行的时候是源码,需要一个源码到机械码的过程。
  • 变量:

    • 变量随时切换,所以运行的时候要随时检查类型。
  • GIL(Global Interpreter Lock)

    • 导致python无法多核CPU并发执行

GIL

全局解释器锁(英语:Global Interpreter Lock,缩写GIL)

是计算机程序设计语言解释器用于同步线程的一种机制,它使得任何时刻仅有一个线程在执行。即便在多核心处理器上,使用GIL的解释器只允许单个时刻单个进程只能使用一个线程。

(java的多线程,如果是在单核cpu上,实际上也是同时只有一个线程执行,只是多线程之间进行快速切换,感觉像是多线程一样)

image-20220219192046527

为什么要引入GIL

简而言之:Python设计初期,为了规避并发问题引入了GIL,现在想去除却去不掉了!

为了解决多线程之间数据完整性和状态同步问题,Python中对象的管理,是使用引用计数器进行的。就是通过一个变量被引用的次数来判断是否需要被释放。引用数为0则释放对象。

如下图:线程A和线程B都引用了对象obj,则obj.ref_num=2,而这个时候线程A和B都正好撤销对obj的引用:

  • A:obj.ref_num=1
  • B:obj.ref_num=0,B中撤销obj
  • A:A要撤销的时候发现,没有obj了,报错。严重会撤销其他的内存参数。

image-20220219193412240

所以引入GIL简化了python对共享资源的管理。

(java有垃圾回收器,和标记清除算法等,对象的回收由垃圾回收器来解决)

规避GIL带来的限制

  1. 多线程threading 机制依然是有用的,用于IO密集型计算因为在I/O (read,write,send,recv,etc.)期间,线程会释放GIL,实现CPU和IO的并行因此多线程用于IO密集型计算依然可以大幅提升速度但是多线程用于CPU密集型计算时,只会更加拖慢速度
  2. Python提供了multiprocessing,使用multiprocessing 的多进程机制实现并行计算、利用多核CPU优势为了应对GIL的问题。

(Python由于cpython解释器的原因,似乎=对多进程并不支持,但是可以通过multiprocessing调用多个解释器来实现多进程。)

thon解释器的原因,似乎=对多进程并不支持,但是可以通过multiprocessing调用多个解释器来实现多进程。)

【2021最新版】Python 并发编程实战,用多线程、多进程、多协程加速程序运行_哔哩哔哩_bilibili

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Python中的KeyboardInterrupt是一个异常,当用户在程序运行时按下Ctrl+C键时,就会触发这个异常。这个异常通常用于中断程序的执行,以便用户可以在需要时停止程序的运行。KeyboardInterrupt异常的出现通常是由于用户想要停止程序的执行,或者是由于程序出现了无限循环等问题导致的。 ### 回答2: Python的KeyboardInterrupt异常通常是由用户在程序运行期间按下“Ctrl + C”键触发的。当用户希望停止程序的执行时,通常会使用这个组合键。因此,这个异常通常是作为一种手动终止程序的方式。 当程序收到KeyboardInterrupt异常时,它会停止当前的操作并退出程序。所以,你可以在控制台或命令行中,通过 Keyboard Interrupt 来终止正在运行的 Python 程序。 KeyboardInterrupt除了用户手动中断程序外,它还可以在其他情况下被自动抛出。比如,当程序运行时间超过一定的时限,就可能会发生KeyboardInterrupt异常。 还有一种情况,就是当程序在执行某些输入/输出操作时被中断。比如,当你尝试读取一个长时间不可用的网络连接或者尝试从一个没有数据可供读取的管道中读取数据时,就可能会发生这种情况。 总之,KeyboardInterrupt异常是由用户手动终止程序或者程序在执行输入/输出操作时被中断所引起的异常,常用于强制停止正在运行的 Python 程序。 ### 回答3: Python中KeyboardInterrupt异常是由于用户在程序运行时使用了Ctrl + C或Ctrl + Break中断程序执行而引起的。通常情况下,程序运行时会等待用户的键盘输入,直到程序接收到用户的输入或等待超时。然而,当用户想要强制终止程序,以中止程序的执行时,他们可以通过按下Ctrl + C键或Ctrl + Break键来中断程序。这将触发一个KeyboardInterrupt异常,使程序跳出正在执行的代码块并退出程序。 KeyboardInterrupt异常支持的操作是由Python解释器处理的,当它发生时,Python解释器会立即停止程序的执行,并将控制权交给Python解释器,这意味着程序将结束其执行,并跳出正在执行的代码块。此时,解释器会发送一个中断信号给程序,使其停止执行。如果程序没有正确地处理KeyboardInterrupt异常,它可能会导致程序运行时发生其他错误。这些错误可能会导致程序异常退出或崩溃。 为了避免KeyboardInterrupt异常,需要在程序编写中注意以下几点: 1.使用try-except块捕获KeyboardInterrupt异常,以确保正确处理异常并停止程序的执行。 2.尝试使用信号处理模块,在程序遇到KeyboardInterrupt异常时执行清理操作,并安全地退出程序。 使用这些技巧可以有效地预防Python中的KeyboardInterrupt异常,并确保程序的正常运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值