Python
Python装饰器
装饰器本质上是一个callable object,它可以在让其他函数在不需要做任何代码的变动的前提下增加额外的功能。装饰器的返回值也是一个函数的对象,它经常用于有切面需求的场景。比如:插入日志,性能测试,事务处理,缓存。权限的校验等场景,有了装饰器就可以抽离出大量的与函数功能本身无关的雷同代码并发并继续使用。
参考这个博客https://foofish.net/python-decorator.html
Python的特性
-
无需编译
Python是解释执行的,这意味着它不需要预先编译为机器代码。程序员可以直接运行Python代码,这大大加快了开发和调试的速度。 -
跨平台性
Python代码可以在多种操作系统上运行,如Windows、Mac和Linux等。只要有相应的Python解释器,代码即可在不同的平台上无缝运行,无需修改。 -
动态类型
Python是动态类型的,这意味着不需要预先声明变量的类型。Python解释器在运行时会自动判断变量的类型,给予开发者更大的灵活性。 -
可读性强
Python的语法简洁明了,强调代码的可读性。这使得Python代码易于理解,减少了出错的可能性。 -
交互模式
Python支持交互式编程,开发者可以在命令行中输入Python代码并立即看到结果,方便进行快速测试和调试。 -
快速开发
由于Python的高级数据结构和动态类型,加上其丰富的库,使得开发者可以快速地开发应用程序。 -
强大的库支持
Python有一个庞大的标准库,涵盖了网络、文件、图形、数据库等众多领域。此外,还有大量的第三方库,为开发者提供了强大的支持。 -
垃圾回收
Python自带垃圾回收机制,它会自动管理内存,清除不再使用的对象,减轻了程序员的工作负担。
Python的局限性
1.速度相对较慢
Python 是一种解释性语言,因此在执行代码时会比编译型语言慢一些。虽然 Python 支持 C 语言扩展模块,但相对于 C 语言或其他编译型语言来说,Python 在处理大量数据或需要高性能的应用程序时可能会显得较慢。
-
内存占用较大
Python 的内存管理机制对于小型应用程序来说是非常高效的,但在处理大型数据时,Python 可能会使用大量的内存,这可能会导致性能问题和系统崩溃。 -
全局解释器锁
Python 中的全局解释器锁 (GIL) 限制了多线程并发处理的效率,因为在任何时候只能有一个线程在解释 Python 代码。这使得 Python 对于 CPU 密集型应用程序的支持较差,但对于 I/O 密集型应用程序的支持较好。 -
代码保护较差
由于 Python 是一种开放源代码语言,因此代码保护相对较差,很容易被反编译或者修改。这使得 Python 对于商业软件的开发可能不是优异选择。 -
依赖管理复杂
Python的包管理工具 PIP 虽然方便易用,但当处理复杂的依赖关系时,可能会变得非常棘手。版本冲突和依赖关系问题可能会导致开发和部署过程中的问题。 -
缺乏类型检查
Python 是一种动态类型语言,因此在编译期间无法检查变量的类型。这可能导致在运行时出现类型错误,这些错误可能很难被调试和解决。
Python多进程和多线程的区别
在Python中,多进程和多线程都可以用于实现并发执行,但由于Python的一些特性(如全局解释器锁GIL),它们在某些场景下的表现有很大的区别:
-
全局解释器锁(GIL):
Python的CPython解释器有一个全局解释器锁(GIL),它限制了在多线程环境下同时只有一个线程能够执行Python字节码。这意味着在Python中,多线程对于计算密集型任务(如数学计算、图像处理等)可能无法充分利用多核处理器的优势,从而导致性能瓶颈。然而,多进程没有这个限制,因为每个进程有自己的解释器和内存空间,可以在多核处理器上并行执行。 -
内存和资源:
- 多进程:每个进程有自己独立的内存空间和系统资源,因此进程间的通信和资源共享需要使用进程间通信(IPC)机制,如管道、消息队列、共享内存等。多进程通常适用于需要独立内存空间和系统资源的并发任务,或需要隔离错误和资源泄漏的场景。
- 多线程:线程共享其所属进程的内存空间和系统资源,因此线程间的通信和资源共享更加简单,可以直接通过读写共享变量进行通信。多线程通常适用于需要高效并发执行并共享内存空间的任务,或需要频繁进行上下文切换的场景。
-
性能和开销:
- 多进程:进程有较高的创建、销毁和上下文切换开销,但能够充分利用多核处理器,并且进程间的错误和资源泄漏不太可能影响其他进程。
- 多线程:线程有较低的创建、销毁和上下文切换开销,但由于GIL的限制,对于计算密集型任务,多线程可能无法实现真正的并行。然而,对于I/O密集型任务(如网络请求、文件读写等),多线程可以提高性能,因为在等待I/O操作时,其他线程可以继续执行。
总之,在Python中,多进程和多线程在某些场景下有很大的区别。对于计算密集型任务,多进程通常能够提供更好的性能;而对于I/O密集型任务,多线程可能是更合适的选择。具体选择使用多进程还是多线程取决于具体的需求和场景。
Python GIL锁
Python 全局解释器锁或GIL,简单来说,是一个互斥锁(或锁),它只允许一个线程控制 Python 解释器。
这意味着在任何时间点都只能有一个线程处于执行状态。执行单线程程序的开发人员看不到 GIL 的影响,但它可能是 CPU 密集型和多线程代码中的性能瓶颈。
由于即使在具有多个 CPU 内核的多线程架构中,GIL 也只允许一次执行一个线程。
参考这个文章https://blog.csdn.net/allway2/article/details/118055423
*args和**kwargs的区别
nonlocal和global的区别
with语句上下文管理的两种实现方法
classmethod和staticmethod的区别
迭代器和生成器
迭代器要实现的两个接口
协程和线程,进程的区别
is和==的区别
可变类型和不可变数据类型
操作系统
进程和线程的区别
-
定义:
- 进程(Process):进程是一个运行中的程序的实例。它具有独立的内存空间、系统资源(如文件描述符、信号量等)和独立的执行环境。进程可以创建和销毁其他进程。
- 线程(Thread):线程是进程中的一个执行单元。线程共享其所属进程的内存空间和系统资源,但每个线程有自己的程序计数器、堆栈和寄存器等执行环境。线程可以并行执行,并且一个进程可以有多个线程。
-
资源分配:
- 进程:操作系统为每个进程分配独立的内存空间和系统资源。当进程之间需要通信时,需要使用进程间通信(IPC)机制,如管道、消息队列、共享内存等。
- 线程:线程共享其所属进程的内存空间和系统资源,因此线程间的通信更加简单,可以直接通过读写共享变量进行通信。
-
上下文切换:
- 进程:进程之间的上下文切换需要较多的时间和资源,因为操作系统需要保存和恢复进程的完整执行环境。
- 线程:线程之间的上下文切换通常较快,因为它们共享相同的内存空间和系统资源,只需要保存和恢复部分执行环境。
-
开销和性能:
- 进程:进程有较高的创建、销毁和上下文切换开销,但因为每个进程有独立的内存空间,进程间的错误和资源泄漏不太可能影响其他进程。
- 线程:线程有较低的创建、销毁和上下文切换开销,但因为共享内存空间,一个线程的错误(如内存泄漏、数组越界等)可能影响其他线程甚至整个进程。
-
使用场景:
- 进程:适用于需要独立内存空间和系统资源的并发任务,或需要隔离错误和资源泄漏的场景。
- 线程:适用于需要高效并发执行并共享内存空间的任务,或需要频繁进行上下文切换的场景。