编程语言工具和环境

此生再无相见时 提交于 2020-03-04 19:58:19
  1. 什么是python的生成器?
    python生成器是一个返回可以迭代对象的函数,可以被用作控制循环的迭代行为。生成器类似于返回值为数组的一个函数,这个函数可以接受参数,可以被调用,一般的函数会返回包括所有数值的数组,生成器一次只能返回一个值,这样消耗的内存将会大大减小。
    yield生成器解释

  2. Java抽象类和接口的区别?

  • Java中,一个类可以实现多个接口,但是一个类只能继承一个抽象类。
  • 接口中只包含接口签名,而抽象类可以提高默认实现,子类可以重载抽象类方法。
  • 接口中默认的所有方法均为public修饰,而抽象类可以用protected修饰符。
  • 接口中不允许定义任何属性,而抽象类中可以定义属性和常量在应用场景中。
  • 在应用场景中使用接口来完成同一方法的不同实现,若不同的方法实现需要共享同样的行为或状态则用抽象类。
  1. python中is和==的区别
    is是用来判断两个变量引用的对象是否为同一个,==用于判断引用对象的值是否相等。可以通过id()函数查看引用对象的地址。

  2. python方法解析顺序
    Python的方法解析顺序优先级从高到低为:实例本身->类->继承类(继承关系越近,越先定义,优先级越高)
    方法解析:是一种在多重继承中用于确定方法搜索顺序的算法.

  3. Ctrl+C程序挂掉还是抛出异常,如何判断两个dict是否一样,list头上删除元素,字符串拼接?
    Ctrl+C会挂掉程序
    通过is可以判断两个dict是否相同
    list.pop(0)删除list第一个元素
    join()函数进行字符串拼接

  4. pytorch中cuda()作用,两个Tensor,一个加了cuda(),一个没加,相加后很怎样?
    cuda()将操作对象放在GPU内存中,加了cuda()的Tensor放在GPU内存中而没加的Tensor放在CPU内存中,所以这两个Tensor相加会报错。

  5. python中dict和list的区别,dict的内部实现
    dict查找速度快,占用的内存较大,list查找速度慢,占用内存较小,dict不能用来存储有序集合。Dict用{}表示,list用[]表示。
    dict是通过hash表实现的,dict为一个数组,数组的索引键是通过hash函数处理后得到的,hash函数的目的是使键值均匀的分布在数组中。

  6. Java虚拟机内存的划分
    程序计数器,本地方法栈,虚拟机栈,堆,方法区和运行时的常量池。

  7. python dict按照value进行排序

  • 按照value从大到小排序:
    sorted(d.items(),key = lambda x:x[1],reverse = True)
  • 按照value从小到大排序:
    sorted(d.items(),key = lambda x:x[1],reverse =False)
  1. C++中static关键字的作用
    同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,所以加了static关键字的变量和函数可对其它源文件隐藏。还可以保持变量内容的持久性。用static前缀作为关键字的变量默认的初始值为0。

  2. 虚函数和纯虚函数的区别
    含有纯虚函数的类称为抽象类,只含有虚函数的类不能称为抽象类。虚函数可以直接被使用,也可以被子类重载以后以多态形式调用,而纯虚函数必须在子类中实现该函数才可使用,因为纯虚函数在基类中只有声明而没有定义。虚函数必须实现,对虚函数来说父类和子类都有各自的版本。

  3. Python多进程
    方式一: os.fork()
    方式二:使用multiprocessing模块:创建Process的实例,传入任务执行函数作为参数
    方式三:使用multiprocessing模块:派生Process的子类,重写run方法
    方式四:使用进程池Pool

  4. 深拷贝,浅拷贝

  • 深拷贝与浅拷贝的区别
    深复制和浅复制最根本的区别在于是否是真正获取了一个对象的复制实体,而不是引用。
  • 浅复制 —-只是拷贝了基本类型的数据,而引用类型数据,复制后也是会发生引用,我们把这种拷贝叫做“(浅复制)浅拷贝”,换句话说,浅复制仅仅是指向被复制的内存地址,如果原地址中对象被改变了,那么浅复制出来的对象也会相应改变。
  • 深复制 —-在计算机中开辟了一块新的内存地址用于存放复制的对象。
  1. 抽象类和接口的区别
    在这里插入图片描述
  2. 有看过c++的一些库吗?
  • 标准库
    C++标准库,包括了STL容器,迭代器,算法和函数等。
    容器:list、vector、map、set
    C++ Standard Library:是一系列类和函数的集合,使用核心语言编写,也是C++ISO自身标准的一部分。
    Standard Template Library:标准模板库
    C POSIX library:POSIX系统的C标准库规范
    ISO C++ Standards Committee:C++标准委员会

  • 框架
    C++通用框架和库
    Apache C++ Standard Library:是一系列算法,容器,迭代器和其他基本组件的集合
    ASL:Adobe源代码库提供了同行的评审和可移植的C++源代码库。
    Boost:大量通用C++库的集合。
    BDE:来自于彭博资讯实验室的开发环境。
    Cinder:提供专业品质创造性编码的开源开发社区。
    Cxxomfort:轻量级的,只包含头文件的库,将C++ 11的一些新特性移植到C++03中。
    Dlib:使用契约式编程和现代C++科技设计的通用的跨平台的C++库。
    EASTL:EA-STL公共部分
    ffead-cpp:企业应用程序开发框架
    Folly:由Facebook开发和使用的开源C++库
    JUCE:包罗万象的C++类库,用于开发跨平台软件
    libPhenom:用于构建高性能和高度可扩展性系统的事件框架。
    LibSourcey :用于实时的视频流和高性能网络应用程序的C++11 evented IO
    LibU:C语言写的多平台工具库
    Loki:C++库的设计,包括常见的设计模式和习语的实现。
    MiLi:只含头文件的小型C++库
    openFrameworks :开发C++工具包,用于创意性编码。
    Qt:跨平台的应用程序和用户界面框架
    Reason:跨平台的框架,使开发者能够更容易地使用Java,.Net和Python,同时也满足了他们对C++性能和优势的需求。
    ROOT:具备所有功能的一系列面向对象的框架,能够非常高效地处理和分析大量的数据,为欧洲原子能研究机构所用。
    STLport:是STL具有代表性的版本
    STXXL:用于额外的大型数据集的标准模板库。
    Ultimate++:C++跨平台快速应用程序开发框架
    Windows Template Library:用于开发Windows应用程序和UI组件的C++库
    Yomm11:C++11的开放multi-methods.

  1. Python 锁
    Python中的各种锁:
    一、全局解释器锁(GIL)
    1、什么是全局解释器锁
    它使得任何时刻仅有一个线程在执行。即便在多核心处理器上,使用 GIL 的解释器也只允许同一时间执行一个线程。常见的使用 GIL 的解释器有CPython与Ruby MRI。GIL的设计简化了CPython的实现,使的对象模型包括关键的内建类型,如:字典等,都是隐含的,可以并发访问的,锁住全局解释器使得比较容易的实现对多线程的支持,但也损失了多处理器主机的并行计算能力。
    2、全局解释器锁的好处
    1)避免了大量的加锁解锁的好处
    2)使数据更加安全,解决多线程间的数据完整性和状态同步
    3)全局解释器的缺点
    多核处理器退化成单核处理器,只能并发不能并行。
    4、GIL的作用:
    多线程情况下必须存在资源的竞争,GIL是为了保证在解释器级别的线程唯一使用共享资源(cpu)。
    二、同步锁
    1、什么是同步锁?
    同一时刻的一个进程下的一个线程只能使用一个cpu,要确保这个线程下的程序在一段时间内被cpu执,那么就要用到同步锁。
    2、为什么用同步锁?
    因为有可能当一个线程在使用cpu时,该线程下的程序可能会遇到io操作,那么cpu就会切到别的线程上去,这样就有可能会影响到该程  序结果的完整性。
    3、怎么使用同步锁?
    只需要在对公共数据的操作前后加上上锁和释放锁的操作即可。
    4、同步锁的所用:
    为了保证解释器级别下的自己编写的程序唯一使用共享资源产生了同步锁。
    三、死锁
    1、什么是死锁?
    指两个或两个以上的线程或进程在执行程序的过程中,因争夺资源或者程序推进顺序不当而相互等待的一个现象。
    2、死锁产生的必要条件?
    互斥条件、请求和保持条件、不剥夺条件、环路等待条件
    3、处理死锁的基本方法?
    预防死锁、避免死锁(银行家算法)、检测死锁(资源分配)、解除死锁:剥夺资源、撤销进程
    四、什么是递归锁?
    在Python中为了支持同一个线程中多次请求同一资源,Python提供了可重入锁。这个RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次require。直到一个线程所有的acquire都被release,其他的线程才能获得资源。递归锁分为可递归锁与非递归锁。
    五、什么是乐观锁?
    假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。
    六、什么是悲观锁?
    假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。
    七、python常用的加锁方式?
    互斥锁、可重入锁、迭代死锁、互相调用死锁、自旋锁。
    可重入互斥锁(英语:reentrant mutex)是互斥锁的一种,同一线程对其多次加锁不会产生死锁. 可重入互斥锁一般都会记录被加锁的次数,只有执行相同次数的解锁操作才会真正解锁。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!