zoukankan      html  css  js  c++  java
  • Python常考面试题

    1、 多进程、多线程?

    出现概率较高, 但是实际用处特别少

    先将两个概念阐述一遍,再来找不同。

    进程:一个程序的执行实例就是一个进程。 每一个进程提供执行程序的所有资源(进程的本质是所有资源的集合),一个进程有一个虚拟的地址空间、可执行的代码、操作系统的接口、安全的上下文(记录启动该进程的用户和权限等)、唯一的进程ID、环境变量、优先级别、最小和最大的工作空间(内存空间),还要有至少一个线程。每一个进程启动时候都会最下产生一个进程,即主线程 然后主线程会再创建其他的子线程。

    线程:线程是操作系统能够进行运算调度的最小单位。他被包含在进程之中,是进程中的实际工作单位。一条线程指的是进程中的一个单一顺序的控制流,一个进程就可以并发多个线程,每条线程并行执行不同的任务,一个线程是一个execution context(执行上下文),即一个cpu执行时需要的一串指令。

    找不同阶段:

    1. 同一个进程中的线程共享同一内存空间、数据,但是进程之间是独立的。
    2. 对主线程的修改可能会影响其他线程的行为, 但是父进程的修改(除了删除)不会影响其他子进程
    3. 线程是一个上下文的执行指令,而进程则是与运算相关的一簇资源
    4. 同一个进程的线程之间可以直接通信, 但是进程之间的交流需要借助于中间代理来实现
    5. 创建新的线程很容易,但是创建新的进程需要对父进程做一次复制
    6. 一个线程可以操作同一进程中的其他线程, 但是进程只能操邹其子进程
    7. 线程启动速度快, 进程启动速度慢(但是两者的运行速度没有可比性)
    8. 可以参考 这个 博客介绍的非常详细

    2、闭包相关概念

    面试了一些公司发现闭包概念考的频率比较高

    什么是闭包】:在一个函数中,定义了一个内函数,内函数运用了外函数的临时变量,并且外函数返回的值是内函数的引用,就是一个闭包

    闭包作用】:通俗来讲就是实现变量的重复使用,正常来说,当一个函数结束的时候,函数内部的局部变量都会被释放,但是闭包比较特殊,如果在释放时候发现外函数的临时变量将来可能在内函数中使用,将会把这个临时变量绑定给内函数,然后自己再结束

    由闭包又可以联系到装饰器

    【什么是装饰器、作用】:用于扩展原来函数功能的一种函数,目的是不改变原函数(或类)的情况下扩展原函数

    【python内置的三个装饰器】:

    以下三个都是类装饰器

    staticmethod:类静态方法,其跟成员方法的区别是没有 self 参数,并且可以在类不进行实例化的情况下调用

    classmethod:与成员方法的区别在于所接收的第一个参数不是 self (类实例的指针),而是cls(当前类的具体类型)

    property:是属性的意思,表示可以通过属性的方式访问函数

    【装饰器使用场景】:

    3、新式类和经典类

    【区别】:

    1. 继承搜索顺序:新式类采用的是广度,经典类采用的是深度优先
    2.  新式类增加了__slots__内置属性, 可以把实例属性的种类锁定到__slots__规定的范围之中。
    3.  新式类增加了__getattribute__方法
    4. 新式类内置有__new__方法而经典类没有__new__方法而只有__init__方法
    5. Python 2.x中默认都是经典类,只有显式继承了object才是新式类,Python 3.x中默认都是新式类

    4.GIL(全局解释器锁)

    【概念】:GIL并不是python的特性,他是在实现python解释器时引用的一个概念。GIL只在CPython解释器上存在。

    不过,在Python的解释器中,使用最多的都是CPython解释器,所以我们不可避免的会遇到GIL

    【作用】GIL的作用与互斥锁的作用相似,是为了解决解释器中多个线程资源竞争的问题。

    【GIL和互斥锁的区别】:

    线程互斥锁是Python代码层面的锁,解决我们自己写的Python程序中多线程共享资源的问题。

    GIL是Python解释器层面的锁,解决解释器中多个线程的竞争资源问题。

    【影响】:

    • 因为GIL的存在,在Python中同一时刻有且只有一个线程会执行,Python中的多线程被称为“伪多线程”
    • GIL在程序中有IO操作时才切换到其他线程,所以Python中的多线程不适合计算密集型的程序,只适合IO密集型的程序

    5、数据类型对比

    【链表和list】:

    链表:申请内存时候可以不是连续的, 删除和插入快,不需要移动大量的节点,只需要修改节点“指针”

    列表:内存必须连续,每次执行 insert 的时候都需要移动插入点右边的所有元素

    set和list:set无重复,set存储根据哈希值来排序查询速度比list快得多

    dict和list:查询速度比list快, dict的键与set相同

     

     

      

     

     

  • 相关阅读:
    资源放送丨《Oracle存储过程中的性能瓶颈点》PPT&视频
    警示:一个update语句引起大量gc等待和业务卡顿
    周末直播丨细致入微
    Java VS Python:哪个未来发展更好?
    【LeetCode】279.完全平方数(四种方法,不怕不会!开拓思维)
    事件驱动
    Android初级教程以动画的形式弹出窗体
    Android简易实战教程--第五话《开发一键锁屏应用》
    迎战大数据-Oracle篇
    Android初级教程获取手机位置信息GPS与动态获取最佳方式
  • 原文地址:https://www.cnblogs.com/musl/p/13039105.html
Copyright © 2011-2022 走看看