码迷,mamicode.com
首页 > 编程语言 > 详细

python提高知识点

时间:2018-07-08 23:16:31      阅读:264      评论:0      收藏:0      [点我收藏+]

标签:列表切片   释放   效率   输出   from   time   面向   继承   线程   

  python提高

1   全局解释器锁(GIL---不是python的特性

描述Python GIL的概念, 以及它对python多线程的影响?编写一个多线程抓取网页的程序,并阐明多线程抓取程序是否可比单线程性能有提升,并解释原因。

1.     Python语言和GIL没有任何关系。仅仅是由于历史原因在Cpython虚拟机(解释器),难以移除GIL。(java编写的python解释器不存在这个问题)

2.     GIL:全局解释器锁。每个线程在执行的过程都需要先获取GIL,保证同一时刻只有一个线程可以执行代码。

3.     线程释放GIL锁的情况: 遇到IO阻塞时,可以暂时释放GIL

4.     Python使用多进程是可以利用多核的CPU资源的。

5.     多线程爬取比单线程性能有提升,因为遇到IO阻塞会自动释放GIL

解决GIL的两种方法:使用其他语言编写的解释器、使用其他语言编写多线程、使用多进程

 

2   io 密集型和 cpu 密集型区别

io 密集型:系统运作,大部分的状况是 CPU 在等 I/O (硬盘/内存) 的读/

Cpu 密集型:大部份时间用来做计算、逻辑判断等 CPU 动作的程序称之 CPU 密集型

3  深拷贝和浅拷贝

浅拷贝:拷贝最顶层的数据给新的对象,只是拷贝了引用

深拷贝:拷贝对象及其内部的对象

切片、字典拷贝和copy.copy()一样,都是浅拷贝

注意点

对不可变类型和可变类型的copy不同:

1.     copy.copy对于可变类型,会进行浅拷贝。

2.     copy.copy对于不可变类型,不会拷贝,仅仅是指向。

3.     copy.deepcopy对于全部是不可变类型的数据,也不会拷贝,仅仅是指向

copy.copycopy.deepcopy的区别。

1copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象

2copy.deepcopy 深拷贝 拷贝对象及其子对象

4   私有化

xx: 公有变量

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

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

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

xx_:单后置下划线,用于避免与Python关键词的冲突,不推荐使用。

5  模块搜索顺序

import sys  # 导入模块

sys.path  # 返回查找模块的列表目录,列表中的路径的先后顺序代表了python解释器在搜索模块时的先后顺序。第一个元素返回的是一个空字符串表示当前目录。

sys.path.append(‘/home/itcast/xxx‘)  # 在列表最后追加搜索目录

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

6  重新导入模块

from imp import reload

reaload(模块名)

(必须得先import 模块)

7  多模块开发时注意事项

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

模块导入顺序:python标准库、第三方库、自定义模块

8  继承、封装和多态

       封装就是把方法和属性封装到类的内部,只需要在类的外部,通过对象即可调用。继承实现了代码的重用。子类可以继承父类,并且可以继承多个父类即多继承,子类可以使用父类所拥有的属性和方法(除了私有属性和方法)。多态是以继承和重写父类方法为前提,增加了代码的灵活度,只是一种调用技巧。

9  多继承和MRO顺序

多继承是指子类继承了多个父类,可以通过三种方法调用父类的方法:

1.     父类.父类中的方法(self):这种方法容易造成父类中的方法被多次调用,而且父类中的方法一旦改变子类中的方法也要改变。

2.     super(指定某个类名, self).父类方法():从指定类名的MRO顺序下一级开始调用。

3.     super().父类中方法():从当前类的mro顺序开始调用父类中方法。

mro:方法解析顺序 Method Resolution Order

通过class.__mro__查看当前类的mro调用顺序

说明:

           单继承使用哪一种方法都可以,基本上无差别,但是建议使用super()方法。单继承中只需要传父类参数,多继承需要传全部的参数。

 

10      类属性和实例属性的区别

类是有个特殊的对象即类对象,描述类的特性的是类属性,类属性在初始化方法(init)之外定义的,实例对象所共有,类属性在内存中只有一份。

实例属性在init方法之内定义的,是实例对象所独有的,在各自的内存中保存,由对象去访问。

11      实例方法、类方法和静态方法的区别

1.     这三种方法都封装在类的内部,调用者不同。

2.     实例方法是由实例对象调用,至少有一个参数self

3.     类方法是由类对象调用,类方法需要classmothed修饰器修饰。

4.     静态方法由类对象调用,不需要参数,需要staticmothed修饰器修饰。

注意:区别从调用者、参数和是否需要修饰器修饰三个方面入手

12      property属性

property属性:一种用来像是使用实例属性一样的特殊属性,可以应用于某个方法。

注意:

1.      在实例方法的基础上,通过property修饰器修饰,只有一个参数self

2.     获取property属性,不能加括号,加上会报错。

   

    实现property属性的两种方法:修饰器、类属性

           修饰器:经典类中,只有property修饰器即@property。新式类有三类即@property@方法.setter@方法.deleter,分别是取值、修改、删除。

           类属性:通过类属性实现property属性时,经典类和新式类无差别,property()中有四个参数,前三个是方法(取值、修改、删除),第四个参数是字符串

property方法中有个四个参数:

           第一个参数是方法名,调用 对象.属性 时自动触发执行方法

           第二个参数是方法名,调用 对象.属性 XXX 时自动触发执行方法

           第三个参数是方法名,调用 del 对象.属性 时自动触发执行方法

           第四个参数是字符串,调用 对象.属性.__doc__ ,此参数是该属性的描述信息

13      常见的魔方属性、方法

__doc__             表示类的描述信息

__module__       表示当前操作的对象在那个模块

__class__           表示当前操作的对象的类是什么

__new__            创建对象时为对象分配空间,在初始化方法__init__之前被调用

__init__              初始化方法,通过类创建对象时,自动触发执行

__del__              当对象在内存中被释放时,自动触发执行

__call__             对象后面加括号,触发执行,例如对象()或者类名()()

__dict__             类或对象中的所有属性

__str__               在打印对象时,默认输出该方法的返回值(自定义字符串)

14      with与上下文管理器

任何实现了 __enter__() __exit__() 方法的对象都可称之为上下文管理器,上下文管理器对象可以使用 with 关键字。

 

Python 还提供了一个 contextmanager 的装饰器,更进一步简化了上下文管理器的实现方式。通过 yield 将函数分割成两部分,yield 之前的语句在 __enter__ 方法中执行,yield 之后的语句在 __exit__ 方法中执行。紧跟在 yield 后面的值是函数的返回值。

1. 什么是GILGIL对多线程的影响

GIL全称Global Interpreter Lock(全局解释器锁)。GILPython语言没有任何关系,只是因为历史原因导致在官方推荐的解释器Cpython中遗留的问题。每个线程在执行的过程中都需要先获取GIL,保证同一时刻只有一个线程可以执行代码,但是当遇到IO阻塞会自动的释放GIL锁,所以使用多线程还是比单线程的效率要高。如果想发挥多核CPU资源,可以使用多进程。为了避免受GIL的影响可以不用官方推荐的Cpython,或者用其他语言来实现。

计算密集型建议采用进程

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

 

2.深拷贝和浅拷贝

浅拷贝是对一个对象的顶层(外层)拷贝,只是拷贝了引用,并没有拷贝内容。

变量的赋值是地址的引用,也算是一种浅拷贝。

copy.copy()

 

深拷贝则是对一个对象深层(递归)的拷贝。

copy.deepcopy()

 

可变类型:列表、字典

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

 

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

 

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

 

(了解)列表切片、字典的copy方法均属于浅拷贝

 

3.私有化

xx: 公有变量

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

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

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

xx_:单后置下划线,用于避免与Python关键词的冲突,不推荐使用。

 

4.模块搜索顺序

import sys

sys.path  # 返回查找模块的列表目录,列表中的路径的先后顺序代表了python解释器在搜索模块时的先后顺序。第一个元素返回的是一个空字符串表示当前目录。

sys.path.append(‘/home/itcast/xxx‘)  # 在列表最后追加搜索目录

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

 

5.重新导入模块

from imp import reload

reaload(模块名)

必须得先import 模块

 

6.多模块开发时注意事项

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

块名.变量的方式去调用。

7.面向对象的三大特性(封装、继承、多态)

封装就是把方法和属性封装到类的内部,只需要在类的外部,通过对象即可调用。继承实现了代码的重用。子类可以继承父类,并且可以继承多个父类即多继承,子类可以使用父类所拥有的属性和方法(除了私有属性和方法)。多态是以继承和重写父类方法为前提,增加了代码的灵活度,只是一种调用技巧。

 

 

 

 

python提高知识点

标签:列表切片   释放   效率   输出   from   time   面向   继承   线程   

原文地址:https://www.cnblogs.com/itelephant/p/9281445.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!