Python提高1
来源:互联网 发布:java重载 返回值 编辑:程序博客网 时间:2024/06/04 04:13
- 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锁
2 深拷⻉、浅拷贝
浅拷⻉是对于⼀个对象的顶层拷⻉通俗的理解是:拷⻉了引⽤并没有拷⻉
深拷⻉深拷⻉是对于⼀个对象所有层次的拷⻉(递归)
注意点浅拷⻉对不可变类型和可变类型的copy不同
可变类型:
copy: 会生成一个新的对象
如果是列表或者字典, 容器中的元素只是拷贝了引用
deepcopy: 会生成一个新的对象
如果是列表或者字典, 容器中的元素会拷贝一份全新的
不可变类型:
copy: 仅仅增加了一个原来对象的引用
deepcopy: 元组中如果是不可变类型就增加引用,如果元组中是可变类型,就是拷贝一份全新的, 并且元组中的元素也都是全新的有化xx:
公有变量x: 单前置下划线,私有化属性或⽅法,from somemodule import *禁⽌导⼊,类对象和⼦类可以访问xx:双前置下划线,避免与⼦类中的属性命名冲突,⽆法在外部直接访问(名字重整所以访问不到)__xx:双前后下划线,⽤户名字空间的魔法对象或属性。例如: init , _ 不要⾃⼰发明这样的名字xx_:
单后置下划线,⽤于避免与Python关键词的冲突通过name mangling(名字重整(⽬的就是以防⼦类意外重写基类的⽅法或者属性)如:_Class__object)机制就可以访问privat入模块
import sys sys.path 表示当前路径列表中的路径的先后顺序代表了python解释器在搜索模块时的先后 程序执⾏时添加新的模块路径 sys.path.append('/home/itcast/xxx') sys.path.insert(0, '/home/itcast/xxx') # 可以确保先搜索这个路径 重新导入模块 模块被导⼊后, import module 不能重新导⼊模块,重新导⼊需 ⽤ reload 用法:from tmp import reload reload(需要重新导入模块的模块名) reload: 不适用与一个单个的文件 一执行就立即结束, 下一次要运行的时候需要重新执行 一个永远都会运行的项目: 服务器, 希望修改的文件能够立即生效 此时就需要使用reload 多模块开发时候注意点 当你用 from A import B 导入模块时候 你对B修改,并不会影响到实际的B的值,只是相当于你对自己的环境中创建了一个变量 而用 import A 导入时候,你的修改会直接修改其他模块的值 import 模块名 能够在不同的模块中共享数据
5 魔法属性
无论人或事物往往都有不按套路出牌的情况,Python的类属性也是如此,存在着一些具有特殊含义的属性,详情如下
1. __doc__ 表示类的描述信息 class Foo: """ 描述类信息,这是用于看片的神奇 """ def func(self): pass print(Foo.__doc__) #输出:类的描述信息
2. __module__ 和 __class__
__module__ 表示当前操作的对象在那个模块 __class__ 表示当前操作的对象的类是什么 test.py # -*- coding:utf-8 -*- class Person(object): def __init__(self): self.name = 'laowang' main.py from test import Person obj = Person() print(obj.__module__) # 输出 test 即:输出模块 print(obj.__class__) # 输出 test.Person 即:输出类
3. __init__
初始化方法,通过类创建对象时,自动触发执行 class Person: def __init__(self, name): self.name = name self.age = 18 obj = Person('laowang') # 自动执行类中的 __init__ 方法
4. __del__
当对象在内存中被释放时,自动触发执行。 注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,__del__的调用是由解释器在进行垃圾回收时自动触发执行的。 class Foo: def __del__(self): pass
5. __call__
对象后面加括号,触发执行。 注:__init__方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()() class Foo: def __init__(self): pass def __call__(self, *args, **kwargs): print('__call__') obj = Foo() # 执行 __init__ obj() # 执行 __call__
6. __dict__
类或对象中的所有属性 类的实例属性属于对象;类中的类属性和方法等属于类,即: class Province(object): country = 'China' def __init__(self, name, count): self.name = name self.count = count def func(self, *args, **kwargs): print('func') # 获取类的属性,即:类属性、方法、 print(Province.__dict__) # 输出:{'__dict__': <attribute '__dict__' of 'Province' objects>, '__module__': '__main__', 'country': 'China', '__doc__': None, '__weakref__': <attribute '__weakref__' of 'Province' objects>, 'func': <function Province.func at 0x101897950>, '__init__': <function Province.__init__ at 0x1018978c8>} obj1 = Province('山东', 10000) print(obj1.__dict__) # 获取 对象obj1 的属性 # 输出:{'count': 10000, 'name': '山东'} obj2 = Province('山西', 20000) print(obj2.__dict__) # 获取 对象obj1 的属性 # 输出:{'count': 20000, 'name': '山西'}
7. __str__
如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值,要有return。 class Foo: def __str__(self): return 'laowang' obj = Foo() print(obj) # 输出:laowang 8、__getitem__、__setitem__、__delitem__ 用于索引操作,如字典。以上分别表示获取、设置、删除数据 # -*- coding:utf-8 -*- class Foo(object): def __getitem__(self, key): print('__getitem__', key) def __setitem__(self, key, value): print('__setitem__', key, value) def __delitem__(self, key): print('__delitem__', key) obj = Foo() result = obj['k1'] # 自动触发执行 __getitem__ obj['k2'] = 'laowang' # 自动触发执行 __setitem__ del obj['k1'] # 自动触发执行 __delitem__
9、__getslice__、__setslice__、__delslice__
该三个方法用于分片操作,如:列表 # -*- coding:utf-8 -*- class Foo(object): def __getslice__(self, i, j): print('__getslice__', i, j) def __setslice__(self, i, j, sequence): print('__setslice__', i, j) def __delslice__(self, i, j): print('__delslice__', i, j) obj = Foo() obj[-1:1] # 自动触发执行 __getslice__ obj[0:1] = [11,22,33,44] # 自动触发执行 __setslice__ del obj[0:2] # 自动触发执行 __delslice__
阅读全文
0 0
- Python提高1
- python提高
- 如何提高python性能
- python提高性能写法
- Python提高2
- python学习笔记-提高性能
- Python基础提高经典例题
- Python基础提高经典例题
- 提高PYTHON编程的能力---阅读源代码
- 提高Python运行效率的六个窍门
- 提高Python运行效率的六个窍门
- 提高Python运行效率的六个窍门
- 提高Python运行效率的六个窍门
- 提高python代码的执行效率
- python小技巧及速度提高
- Python:逐行读写提高程序性能
- 提高 Python 运行效率的几个方法
- 提高 Python 运行效率的六个窍门
- 夺冠 | 腾讯围棋AI「绝艺」再次问鼎龙星战
- 开启 Windows 下的 Linux 子系统
- Bootstrap(一)
- Android 7.1 GUI系统-窗口管理WMS-窗口添加(三)
- 2017-2018 ACM-ICPC Southeast Regional Contest (Div. 1) J.Treasure Map dp
- Python提高1
- Java并发编程:volatile关键字解析
- Bootstrap(二)
- VRTK基于SteamVR学习笔记
- IDEA 插件activate-power-mode和Grep Console的安装使用
- Bootstrap(三)
- 临时性随笔
- uboot中rtc顶层分析
- 随便写写