面灵AI→

华为OD Python 后端 社招面经:机考、技术面与主管面复盘

轮次
多轮面试
时间
2026-10
来源
牛客网

《面试题目》

  1. 机考三道算法题分别考什么?时间怎么分配?
  2. GIL 是什么?对 Python 多线程有什么实际影响?什么场景下多线程其实是假并行?
  3. 深拷贝和浅拷贝有什么区别?项目里有没有踩过坑?
  4. 装饰器的原理是什么?带参数的装饰器怎么写?
  5. 生成器和迭代器有什么区别?yield 做了什么?
  6. list 和 dict 的底层实现是什么?dict 查询为什么快,什么时候会扩容?
  7. Python 的内存管理和垃圾回收机制是什么?循环引用怎么产生?
  8. 多线程、多进程、协程怎么选?asyncio 有没有实际用过?
  9. 项目里用的什么框架?遇到过什么性能问题,怎么定位的?
  10. 主管面:为什么离开上一家?被鸽这件事现在怎么看?未来三年怎么规划?

《参考解析》

GIL 与并发选型:CPython 的 GIL 让同一时刻只有一个线程执行 Python 字节码,所以 CPU 密集任务用多线程拿不到多核并行,适合用多进程;I/O 密集任务在等待网络或磁盘时会释放 GIL,多线程仍然有效;协程适合大量高并发 I/O 且代码可改造为 async 的场景。答题时补一句:GIL 不等于线程安全,共享可变状态仍然要加锁。

Python 对象与语法:浅拷贝只复制最外层容器,内部元素还是同一对象;深拷贝递归复制,循环引用会用 memo 处理。装饰器本质是接收函数并返回新函数的高阶函数,带参数的装饰器是「先接收参数,再返回真正的装饰器」的三层结构。生成器是惰性产出,yield 把函数变成生成器并在每次产出后暂停,适合大文件流式处理。list 是动态数组,扩容时按比例申请新数组并搬迁;dict 是哈希表,查询平均 O(1),装载因子过高或冲突严重时扩容并重新散列。

内存与回收:CPython 以引用计数为主,计数归零立即回收;分代回收负责处理循环引用,把对象按存活时间分成三代,越老的对象扫描频率越低。循环引用常见于对象互相持有、闭包引用、异常栈帧等。排查内存问题可以用 tracemalloc、gc.get_objects()、objgraph,先确认是泄漏还是缓存没设上限。

性能定位:先看监控和日志确认瓶颈在 CPU、内存、I/O 还是下游依赖,再用 cProfile、py-spy 采样,必要时看数据库慢查询和连接池。优化顺序是先减少无效调用和 N+1 查询,再考虑缓存、批处理、异步化,最后才是换语言或加机器。面试官追问「工作两年算法是不是不用练」,这题的正确态度是承认机考需要单独准备,工作经验不能替代刷题手感。

主管面:被鸽的经历不要只讲情绪,要讲复盘和稳定性:当时把所有希望押在一个 offer 上,后来调整为并行推进、保留保底,并且没有因为一次挫折影响交付。未来三年可以按「先把业务做深—补齐工程能力—能独立负责一个模块」来答,避免空泛的「成为技术专家」。