
1. Python执行效率优化的实战技巧在华为OD的Python技术面试中优化执行效率是必考题。我遇到过不少候选人一上来就喊用多线程结果连GIL锁是什么都说不清楚。真正有效的优化需要分场景施策算法层面优化是最根本的。去年我们处理一个千万级数据去重需求有个候选人用双重循环暴力解法时间复杂度O(n²)直接卡死。改用集合哈希查找后时间复杂度降到O(1)速度提升200倍。这里有个实用技巧多用内置函数如filter()/map()它们用C实现比Python循环快3-5倍。并行计算要区分场景。计算密集型推荐multiprocessing我实测过用Pool处理图像识别任务4核机器速度提升3.8倍。但注意进程间通信成本数据量大的时候pickle序列化会吃掉30%性能。IO密集型可以用协程最近用asyncio重写爬虫代码吞吐量从200QPS提升到1500QPS。JIT编译工具的选择有讲究。PyPy适合纯Python项目我们有个数值计算项目迁移后快了6倍。但涉及C扩展时可能不兼容这时候就得用Cython。记得要给关键函数加上静态类型声明这样生成的C代码效率能提升8-10倍。提示性能优化一定要用timeit模块实测我曾经优化过一个看起来很快的算法结果缓存失效导致生产环境CPU飙满2. 深入理解Python的鸭子类型面试官问鸭子类型时80%的候选人只会背走起来像鸭子就是鸭子。这其实错过了展示Python思维的好机会。我的理解是行为契约比类型重要这个理念让Python的接口设计异常灵活。上周我写了个文件处理类只要对象实现了read()方法就能处理各种来源的数据。测试时发现居然能直接兼容requests库的Response对象这就是鸭子类型的魔力。协议机制是背后的实现原理。比如迭代器协议要求实现__iter__()和__next__()for循环根本不关心对象类型。我经常用这个特性封装数据库查询结果代码既简洁又通用。记得用collections.abc做接口检查比直接try-except更规范。实际应用中最经典的例子是上下文管理器。不管是文件对象还是数据库连接只要实现了__enter__/__exit__就能用with语句。我见过最巧妙的用法是用它管理临时目录退出自动清理class TempDir: def __enter__(self): self.path mkdtemp() return self.path def __exit__(self, exc_type, exc_val, exc_tb): rmtree(self.path)3. 函数参数传递的底层逻辑*args和**kwargs的区别很多文档讲得太理论。我用实际案例说明可变位置参数*args在装饰器中用得最多。比如写耗时统计装饰器时要处理不同参数个数的函数def timer(func): def wrapper(*args, **kwargs): start time.time() result func(*args, **kwargs) print(fCost: {time.time()-start:.2f}s) return result return wrapper可变关键字参数kwargs在处理API请求时特别有用。最近写Flask接口时用kwargs直接转发参数app.route(/search) def search(): params request.args.to_dict() return query_db(**params) # 自动解包成keyvalue形式参数解包的逆向操作也很有意思。我有次需要动态调用不同函数def call_func(func_name, *args, **kwargs): func globals()[func_name] return func(*args, **kwargs) # 自动解包参数4. 文件读取的性能对比实验read()系列方法的区别光看文档不够直观。我做了个实测大文件处理测试1GB日志文件read()内存暴涨到1GB读取时间2.1秒readlines()内存800MB时间3.4秒因为要构建列表逐行readline()内存稳定在10MB时间4.8秒最佳实践方案是结合生成器def chunk_reader(file_path, chunk_size1024): with open(file_path, r) as f: while chunk : f.read(chunk_size): yield chunk这个方案内存占用恒定为chunk_size处理10GB文件时优势明显。还有个冷门技巧用mmap内存映射处理超大文件速度能再提升30%。5. 第三方库的工程化使用被问到常用库时别只会列名字。面试官更想听选型标准要考虑这些社区活跃度GitHub star和issue处理速度API设计是否符合项目习惯与其他组件的兼容性高级技巧比如用virtualenv配合pip-tools管理精确版本对pandas这种大型库只import需要的子模块用__all__控制from module import *的范围性能优化实例numpy数组运算要避免循环用向量化操作多进程下matplotlib要切换Agg后端requests的Session对象复用TCP连接6. Web框架的架构设计哲学三大框架的区别要从设计目标理解Django的全家桶式设计适合快速验证。我们有个内部管理系统用Django Admin两天就搭出原型。但要注意ORM的N1查询问题中间件顺序影响性能同步特性改造为异步的成本Flask的扩展机制很灵活。去年做的微服务网关用这些组合Flask-RESTful设计APIMarshmallow做数据校验Celery处理异步任务Tornado的异步特性在物联网项目发挥优势。处理设备上报数据时用协程维持10万长连接内置的WebSocket支持注意线程安全问题的规避7. RESTful API的实战经验回答这个问题时要跳出概念说落地资源设计的坑我踩过不少。比如用户权限接口早期设计成/getUserPermissions /setUserPermissions后来改造为符合RESTful的风格GET /users/{id}/permissions PUT /users/{id}/permissions状态码的使用要精确201 Created 用于新建资源202 Accepted 表示异步任务已接收429 Too Many Requests 做限流提示HATEOAS实践案例在分页响应中加入links字段{ data: [...], links: { next: /api/items?page2, prev: null } }8. Python类型系统的工程影响强类型特性在实际开发中表现为类型检查的严格程度# Python会报TypeError 1 1 # JavaScript输出11动态类型的利弊好处是快速原型设计坏处是运行时才暴露类型错误我们项目现在都用mypy做静态检查配合类型注解def process(data: List[Dict[str, Any]]) - pd.DataFrame: ...9. 解释执行的原理与优化编译型语言的典型特征是构建过程差异C需要g编译生成二进制Python直接执行.py文件调试体验不同解释型语言可以REPL即时测试但运行时错误可能到生产环境才发现我们团队用这些方法提升代码质量用pylint做静态分析写unittest时覆盖类型边界case重要模块用Cython编译10. 数据序列化的工程考量字典和JSON的区别体现在内存结构方面字典的key可以是任意hashable对象JSON只支持字符串key使用场景选择进程内通信用字典更高效跨系统传输必须序列化为JSON实际开发中推荐用orjson替代标准json模块速度快3倍。还有个技巧用json.JSONEncoder扩展复杂对象的序列化class CustomEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, datetime): return obj.isoformat() return super().default(obj)在华为OD的实际项目中我习惯用pydantic做数据验证它的JSON序列化性能比手工实现稳定得多。