python高级语法(一)

GIL全局解释器锁

什么是GIL全局解释器锁

GIL是仅存在与CPython中的一把锁

GIL产生的背景 在CPython解释内部运行多个线程的时候,每个线程都需要解释器内部申请相应的全局资源,由于C语言本身比较底层造成CPython在管理所有全局资源的时候并不能应对所有线程同时的资源请求,因此为了防止资源竞争而发生错误,对所有线程申请全局资源增加了限制-全局解释器锁。

因此,全局解释器锁就是锁住了整个解释器内部的全局资源,一次只能给一个线程使用。这就造成了在CPython中,同一个进程下同时只能有一个线程去运行。因此,同一进程下的各个线程之间只能并发运行,不能真的实现并行。

线程何时会释放GIL锁

在python线程正,如果遇到IO操作等耗时操作,或者执行时间达到阈值就会释放当前的GIL锁。接下来要想继续运行,必须重新获取GIL锁。

如何避免这种现象

  1. GIL锁只存在CPython中,所以换一个解释器就可以避免。
  2. GIL锁是对同一进程中线程限制,因此可以使用多进程来避免这种情况。
  3. 换其他语言编写程序。。。

多线程单线程的选择

在单纯进行大量计算操作的时候可以选择单线程
在进行诸如网络爬取等需要大量IO操作的程序时,可以选择多线程

深拷贝~浅拷贝

对象之间的赋值,本质上就是对象之间引用的传递而已

按数据类型分类

1、 拷贝单一的可变的简单数据类型 a = []

深拷贝和浅拷贝一样 都会开辟一片新的空间存储数据 都可以保证数据的独立性

2 、拷贝复杂的有嵌套的可变数据类型的时候 a = [[],[]]

浅拷贝:只会开辟一片空间存贮的是引用 无法保证数据的独立性
深拷贝:会开辟多个空间存贮所有的数据 可以保证数据的独立性的

3、 拷贝不可变类型(常量,字符串,元组)

深拷贝和浅拷贝都一样 都不会开辟新的空间 而是直接引用 不可变数据类型数据是无法发生改变的 不需要保证数据独立性

扫描二维码关注公众号,回复: 4196564 查看本文章

4、 不可变类型中嵌套可变类型

浅拷贝 只会关心最外层的数据类型 如果最外层是不可变的数据类型 直接引用 无法保证数据的独立性
深拷贝 进行递归的查找 只要发现有可变类型 就会开辟足够多的空间存储数据 可以保证数据的独立性的

5、 字典拷贝和切片拷贝

python中自带的大多数拷贝都是浅拷贝

import导入模块

在python中我们常用两种方式导入模块,分别是import和from-import

模块导入路径问题

有时,在我们编写程序时虽然已经导入了所有需要的模块,但是程序却无法正确运行。就有可能是模块导入路径的问题。
在python中,导入sys模块后可以调用sys.path()方法来查看python的默认导入模块路径。
代码如下:

import sys
# 由于sys.path是一个列表,所以遍历输出
for i in sys.path:
    print(i)

我的输出结果是:

E:\PyPractices\草稿本
E:\PyPractices\草稿本
E:\python\python37.zip
E:\python\DLLs
E:\python\lib
E:\python
C:\Users\10145\AppData\Roaming\Python\Python37\site-packages
E:\python\lib\site-packages
E:\python\lib\site-packages\pyinstaller-3.4-py3.7.egg
E:\python\lib\site-packages\pywin32_ctypes-0.2.0-py3.7.egg
E:\python\lib\site-packages\altgraph-0.16.1-py3.7.egg
E:\python\lib\site-packages\macholib-1.11-py3.7.egg
E:\python\lib\site-packages\pefile-2018.8.8-py3.7.egg
E:\python\lib\site-packages\future-0.16.0-py3.7.egg
E:\PyCharm 2018.2.3\helpers\pycharm_matplotlib_backend

在以上所有路径中,python会从上往下去寻找你要导入的模块,找到即停止。因此就会有可能出现以上咱们提到的问题。例如我需要导入一个aaa.py,但是我的电脑中有两个该文件分别储存在第一个路径和第二个路径中。此时python便会默认导入第一个。如果我恰好需要的是第二个,那便会出现发现不了的错误了。
解决办法

  1. 按路径导入
  2. 更改路径顺序

import和from-import的区别

有点类似于深拷贝和浅拷贝,import导入的是路径,变量会随着原变量的改变而改变。
from-import导入的是具体的值,相当于在本文件中重新创建了变量对象。
另外,用import导入模块后,在调用时需要带上模块名,而from-import不用。这样看来,似乎是更方便了,但是也存在一个问题就是容易出现模块中变量名和现有代码中变量名重复的现象。这样的话也有可能出现莫名的错误。因此,在两种导入方式之间应该酌情选择。

猜你喜欢

转载自blog.csdn.net/washing1127/article/details/83755938