为什么感觉python比javac?
我们一般使用的 Python 是 CPython,导致它慢的原因主要有下面三条:
它是动态类型语言
它是解释型语言而非编译语言它有 GIL(Global Interpreter Lock全局解释器锁)动态特性导致 Python中的变量没有类型声明,在执行过程中随时可能改变其类型,因此其很难被优化,而且还会有变量类型变动带来的内存释放及重新分配的性能损失。
Python 是一种解释型的语言,不像 C/C++ 等编译型语言会直接将代码编译诚机器吗执行,另外 Python 也没有像 Java 那样的即时编译工具(JIT)。
GIL 限制限制 Python 解释器在一个时刻只能有一个线程执行,线程的调度和切换也会损失一些性能。
要提高 Python 的执行性能,可以针对以上几条限制下功夫:
使用 Cython 为 Python 代码添加一些类型声明,并将其静态编译成可供 Python 调用的扩展模块。
使用 Numba 对 Python 代码做即时编译。打开 GIL。方式有很多,比如说一些库如 numpy 的很多操作都是打开了 GIL 的,我们在程序中调用这些库中的相应操作就能打开 GIL,另外也可以使用 Cython 的 with nogil 语句手动地打开 GIL。使用多进程以避开 GIL 的限制。比如说可以使用标准库中的 multiprocessing 模块,或者使用像 mpi4py 这样的包进行多进程的并行计算。使用并行计算是加速 Python 的非常有效的方式。用 Python 做并行计算的途径有很多,比如说使用标准库中的 [threading 模块](https://docs.python.org/2/library/threading.html)进行线程级别的并行,[multiprocessing 模块](https://docs.python.org/2/library/multiprocessing.html)进行进程级别的并行,[concurrent.futures 模块](https://docs.python.org/3/library/concurrent.futures.html)实现异步并行,使用 [IPython.parallel 模块](https://ipython.org/ipython-doc/3/parallel/index.html)进行多种方式的并行,使用 [mpi4py 包](https://pypi.org/project/mpi4py/)进行 MPI 消息传递并行计算,等等。如果可以使用 C/C++,Fortran 或者使用 cython 为 Python 编写扩展模块,还可以使用 OpenMP 并行。对 GPU 编程则可以使用 [pyCUDA](https://documen.tician.de/pycuda/)。我的个人[简书专题](https://www.jianshu.com/c/5019bb7bada6)和 [CSDN 博客专栏](https://blog.csdn.net/column/details/26248.html)中有对用 Python 做并行计算的专门介绍并提供了大量的程序实例。有需要或者感兴趣的可以了解下。
Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有