开放式面试题

9. 开放式面试题

9.1 如提高python运行效率的方法

难度指数: ★★★
重要指数: ★★★

不存在一招致胜的方法可以有效的提高python的运行效率,泛泛而谈即可

  1. 使用生成器,因为可以节约大量内存
  2. 循环代码优化,避免过多重复代码的执行
  3. 核心模块用Cython PyPy等,提高效率
  4. 使用多进程、多线程、协程
  5. 多个if elif条件判断,可以把最有可能先发生的条件放到前面写,这样可以减少程序判断的次数,提高效率

这些都是工作中的一些经验总结,回答时,挑自己理解的说,免得对方深入提问时答不上来

9.2 遇到异常如何处理

难度指数: ★★★
重要指数: ★★★★★

异常是编程中无法避免的情况,首先,我们要定位问题,异常信息里提供了很关键的信息,比如下面这段代码

def func_tet():
    func_sum('4', 3)


def func_sum(a, b):
    value = a + b
    return value


func_tet()

运行时报错内容为
image
先关注最后一行红色框内的信息,这里的信息明确的指明了异常的类型和异常的解释信息,这是我们分析问题的第一步,随着经验的积累,你很容就能通过异常信息分析出为何会发生异常

异常信息的第二部分,就是蓝色框内的内容,是调用堆栈信息,详细的记录了程序的执行路径,最后一行正是错误发生的位置。

通过异常信息,已经清楚的掌握了异常的类型和发生异常的位置,这通常已经能够帮助我们解决大部分问题。当然也还是存在一些错误和异常,无法通过异常信息来定为和解决,这个时候,就需要我们单步跟踪调试

如果条件允许,使用pycharm 进行调试,这方面的文章参见如何调试程序

如果条件不允许,则使用pudb进行调试,参见文章使用pudb在终端调试python代码

回答的关键点有两个:

  1. 利用异常信息定位问题
  2. 利用工具(pycharm 或者 终端调试工具pudb)来单步跟踪调试

9.3 分别从前端、后端、数据库阐述web项目的性能优化

难度指数: ★★★
重要指数: ★★★★

这是一个非常开放的题目,考察的是你的工作经验,所以,回答的关键不在于有多深入,而在于你知识范围有多广泛,首先需要指明不存在一种方法可以立竿见影的提升web项目的性能,提升性能,首先要定位性能的瓶颈在哪里。

你能说出这个观点,就足以证明,你是一个能抓住问题要点的人,那么接下来,你得谈一谈怎么样定位系统性能的瓶颈。

  1. 页面加载的平均时长你需要统计吧
  2. QPS是多少你需要知道吧
  3. 数据库连接查询的慢查询有多少你需要了解吧
  4. 后端平均响应时长是多少你得知道吧

把这几个数据已统计,基本上系统的瓶颈也就找到了,接下来,从三个方面谈优化

9.3.1 前端优化

  1. 尽可能减少前端http请求的数量
  2. 按照HTTP协议设置合理的缓存
  3. 对图片,js 进行压缩

9.3.2 后端优化

  1. 将访问频次较高的数据放在缓存里,比如redis
  2. 采用异步的架构增加并发,例如tornado
  3. 如果你需要调用更后方的API接口以获取数据,那么可以考虑多线程集中访问

9.3.3 数据库优化

这就实在没什么可说的了,数据库该建索引的要建索引,适合缓存的要放在缓存数据库里,数据量太大了,就考虑分库,分表等方法。

9.4 简述多线程、多进程、协程

难度指数: ★★★
重要指数: ★★★★★

这个问题,是面试时必问的题目,答案几乎都是固定的

  1. 进程:一个运行的程序(代码)就是一个进程,没有运行的代码叫程序,进程是系统资源分配的最小单位,进程拥有自己独立的内存空间,所以进程间数据不共享,开销大
  2. 线程: 调度执行的最小单位,也叫执行路径,不能独立存在,依赖进程存在一个进程至少有一个线程,叫主线程,而多个线程共享内存(数据共享,共享全局变量),从而极大地提高了程序的运行效率
  3. 协程:是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。 协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快

回答到这里,算是合格了,但你面试的是python岗位,所以得围绕着python来展开,有几点要照顾到

  1. python 提供了multiprocessing 模块来支持多进程,在linux上是通过fork来实现多进程的
  2. python 提供了threading 模块来支持多线程,由于有GIL锁的存在,python多线程不能有效利用多核,因此不适合做CPU密集型的任务,但对于I/O密集型的工作还是用得上的
  3. python 提供了asyncio来支持协程,关于协程,你一定要明白,协程的概念是建立在线程的基础之上的,不管协程如何切换,都始终运行在一个线程内。

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案