Python提高1

来源:互联网 发布:java重载 返回值 编辑:程序博客网 时间:2024/06/04 04:13
  1. 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__方法,那么在打印 对象 时,默认输出该方法的返回值,要有returnclass 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__
原创粉丝点击