python笔试题(二),,1.什么是GIL?


1.什么是GIL?    GIL全称Global Interpreter Lock,本质是一把互斥锁,并不是python的特性。python为了保证线程安全而采取的独立线程运行的限制,    说白了就是一个核只能在同一时间运行一个线程.对于IO密集型任务,python多线程起到作用,但对于cpu密集型任务,    python的多线程几乎占不到什么优势,还有可能因为争夺资源而变慢。2.python中staticmethod和classmethod的区别?    区别:调用方法不同        静态方法:由类调用,无默认参数        类方法:由类调用,至少一个cls参数,执行类方法时,自动将调用该方法的类复制给self3.python里面如何拷贝一个对象,并解释深浅拷贝    一般来说可以使用copy.copy()方法或者copy.deepcopy()方法    浅拷贝:创建一个新的对象,但它包含的是对原始对象中包含项的引用(如果用引用的方式修改其中一个对象,另外一个也会被改变)    深拷贝:创建一个新的对象,并且递归的复制它所包含的对象(修改其中一个,另一个不会改变)4.python里面的search()和match()的区别    re模块中match(pattern,string),检查string的开头是否与pattern匹配,返回一个匹配的对象,如果没找到,返回None    re模块中search(pattern,string),在string中搜索第一个匹配值,如果没找到,返回None5.简述迭代器和生成器以及他们之间的区别?    生成器:生成器是一次生成一个值的特殊函数,在函数执行的过程中,yield语句会把你需要的值返回给调用生成器的地方,然后退出函数,           下次调用生成器函数的时候,又从上次中断的地方开始执行,并且生成器内的变量参数会被保存下来供下次使用。    迭代器:任何实现了__iter__和__next__方法的对象都是迭代器。__iter__返回迭代器自身,__next__返回容器中的下一个值。    生成器是特殊的迭代器,它内部具有这两种方法6.什么是协程?python的协程是如何实现的?    协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈,协程调度切换时,将寄存器上下文和栈保存到其他地方,    在切回来时恢复先前保存的上下文和栈,直接操作栈且基本没有内核切换的开销,可以不加锁的访问全局变量,    比如在执行函数A的时候,中断去执行函数B,过会切过来接着执行函数A。    python的协程通过yield关键字来实现.7.什么是装饰器?请用装饰器实现singleton    装饰器本质上是一个python函数或者类,它可以让其他函数或者类在不需要做任何代码修改的前提下,    增加额外功能,装饰器的返回值也是一个函数/类对象.    def singleton(cls,*args,**kwargs):        instance = {}        def _singleton():            if cls not in instance:                instance[cls] = cls(*args, **kwargs)            return instance[cls]        return _singleton    @singleton    class test_singleton(object):        def __init__(self):            self.number = 0        def add(self):            self.num_add = 10    obj_1 = test_singleton()    obj_2 = test_singleton()    print(obj_1,obj_2):8.请使用python实现快速排序    def Quick_Sort(my_List,start,end):           if start < end:            i,j = start,end            base = my_List[i]            while i < j:                while (i < j) and (my_List[j] >= base):                    j = j - 1                my_List[i] = my_List[j]                while (i < j) and (my_List[i] <= base):                    i = i + 1                my_List[j] = my_List[i]            my_List[i]=base            QuickSort(my_List,start,i-1)            QuickSort(my_List,j+1,end)        return my_List    my_List = [42,30,61,80,74,20,24,45]    Quick_Sort(my_List,0,len(my_List)-1)    print(my_List)9.简述MyISAM和InnoDB的特点。    MyISAM适合于一些需要大量查询的应用,但对于有大量写操作并不是很好。比如你只是需要update一个字段,整个表都会被锁起来,而别的进程,        就算是读进程都无法操作直到读操作完成。另外,MyISAM对于select count(*) 这类的计算非常快。    InnoDB的趋势会是一个非常复杂的存储引擎,对于小的应用,会比MyISAM慢,但是支持’行锁‘,在写操作较多时更方便,还支持更多高级应用,比如事务。    10.简述python的垃圾回收机制    python中的垃圾回收是以引用计数为主,标记-清除和分代收集为辅。    引用计数:python在内存中存储每个对象的引用技术,如果计数变成0,该对象就会消失,分配给该对象的内存就会释放。    标记-清除:一些容器对象,比如list,dict,tuple,instace等可能会出现引用循环,对于这些循环,垃圾回收器会定时回收这些循环(对象之间通过引用(指针)连在一起,              构成一个有向图,对象构成这个有向图的节点,而引用关系构成这个有向图的边).    分代收集:python把内存根据对象存活时间划分为三代,对象创建之后,垃圾回收器会分配它们所属的代。每个对象都会被分配一个代,而被分配更年轻的代被优先处理,因此越晚创建的对象越容易被回收。

python笔试题(二)

评论关闭