GIL、深拷贝、浅拷贝、私有化、导入模块

GIL

  • Python语言和GIL没有关系。仅仅是由于历史原因在Cpython虚拟机(解释器),难以移除GIL。
  • GIL:全局解释器锁。每个线程在执行的过程都需要先获取GIL,保证同一时刻只有一个线程可以执行代码。
  • 线程释放GIL锁的情况: 在IO操作等可能会引起阻塞的system call之前,可以暂时释放GIL,但在执行完毕后,必须重新获取GIL Python 3.x使用计时器(执行时间达到阈值后,当前线程释放GIL)或Python 2.x,tickets计数达到100
  • Python使用多进程是可以利用多核的CPU资源的。
  • 多线程爬取比单线程性能有提升,因为遇到IO阻塞会自动释放GIL锁

如果想发挥多核CPU资源,可以使用多进程。为了避免受GIL的影响可以不用官方推荐的Cpython,或者用其他语言来实现,使用多进程。

计算密集型建议采用进程
IO密集型建议采用线程或者协程

深拷贝、浅拷贝

  1. 浅拷贝
    浅拷贝是对于一个对象的顶层拷贝
    通俗的理解是:拷贝了引用,并没有拷贝内容

  2. 深拷贝
    深拷贝是对于一个对象所有层次的拷贝(递归)保证了数据的独立性

可变类型:列表、字典
不可变类型:数字类型、字符串型、元组

如果是可变类型,浅拷贝只拷贝外层,而深拷贝是完全拷贝

如果是纯的不可变类型,那么无论是浅拷贝还是深拷贝,都只是指向同一个地址。如果不可变类型里面还存在可变类型,则浅拷贝是指向,而深拷贝则为完全拷贝。

  1. 拷贝的其他方式
    切片表达式可以赋值一个序列 属于浅拷贝

    字典的copy方法可以拷贝一个字典 属于浅拷贝

浅拷贝对不可变类型和可变类型的copy不同
copy.copy对于可变类型,会进行浅拷贝
copy.copy对于不可变类型,不会拷贝,仅仅是指向

copy.copy和copy.deepcopy的区别

私有化

  • xx: 公有变量

  • _x: 单前置下划线,私有化属性或方法,from somemodule import * 禁止导入,类对象和子类可以访问.

  • __xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到)

  • __xx__:双前后下划线,用户名字空间的魔法对象或属性。例如:__init__ , __ 不要自己发明这样的名字

  • xx_:单后置下划线,用于避免与Python关键词的冲突通过name mangling(名字重整(目的就是以防子类意外重写基类的方法或者属性)如:_Class__object)机制就可以访问private了。

  • 父类中属性名为__名字的,子类不继承,子类不能访问

  • 如果在子类中向__名字赋值,那么会在子类中定义的一个与父类相同名字的属性

  • _名的变量、函数、类在使用from xxx import *时都不会被导入

import导入模块

1. import 搜索路径
在这里插入图片描述

从上面列出的目录里依次查找要导入的模块文件
‘’ 表示当前路径列
表中的路径的先后顺序代表了python解释器在搜索模块时的先后顺序

import sys

sys.path  # 返回查找模块的列表目录,列表中的路径的先后顺序代表了python解释器在搜索模块时的先后顺序。第一个元素返回的是一个空字符串表示当前目录。
sys.path.append('/home/itcast/xxx')  # 在列表最后追加搜索目录
sys.path.insert(0, '/home/itcast/xxx')  # 可以确保先搜索这个路径

程序执行时添加新的模块路径

sys.path.append('/home/itcast/xxx')
sys.path.insert(0, '/home/itcast/xxx')  # 可以确保先搜索这个路径

2.重新导入模块
模块被导入后,import 模块名不能重新导入模块,重新导入需用reload

from imp import reload

reaload(模块名)

3. 多模块开发时的注意点
通过from模块import变量,此时相当于给一个变量赋值,如果在程序种修改了变量的值就导致这个变量成了局部变量,跟其他模块就不共享了。
如果多模块开发时想导入变量,建议使用import 模块名的方式,然后通过 模块名.变量名 的方式去调用

exit(?)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值