with在python中是什么意思
enter在python中的用法?
enter在python中的用法?
__init__与构造函数还是有区别的。脚本语言要灵活一些。
__enter__和__exit__配合起来用于实现with
with open(fn) as fp:
pass
这里file object要实现__enter__和__exit__
从字面上理解enter就是类的初始化准备工作。可能在__init__里完成。
为什么感觉python比java、c 慢很多?
我们一般使用的 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 模块]()进行线程级别的并行,[multiprocessing 模块]()进行进程级别的并行,[concurrent.futures 模块]()实现异步并行,使用 [ 模块]()进行多种方式的并行,使用 [mpi4py 包]()进行 MPI 消息传递并行计算,等等。如果可以使用 C/C ,Fortran 或者使用 cython 为 Python 编写扩展模块,还可以使用 OpenMP 并行。对 GPU 编程则可以使用 [pyCUDA]()。我的个人[简书专题]()和 [CSDN 博客专栏]()中有对用 Python 做并行计算的专门介绍并提供了大量的程序实例。有需要或者感兴趣的可以了解下。