Expert Python Programming Notes

0x00 订阅

0x01 目录

  • 语法最佳实践

  • 命名最佳实践

  • 包管理

  • 代码部署

  • 使用其他语言扩展Python

  • 代码管理

  • 文档构建

  • 测试驱动开发

  • 并发编程

  • 设计模式

0x01 类级别以下的语法最佳实践

TODO

0x02 类级别以上的语法最佳实践

TODO

0x03 优化技术

可能会降低程序运行速度的情况:

  • 基本内置类型使用不当

  • 硬件资源使用模式与执行环境不匹配

  • 过于长时间地等待来自第三方API或后台服务的响应

概率型数据结构

常用于键/值存储系统中加速键查找。

一些流行的概率型数据结构:

  • 近似成员查询(AMQ, Approximate membership query)

  • 布隆过滤器(Bloom Filter)

  • HyperLogLog

缓存技术

技术概念

  • 确定性缓存:针对确定性函数,给定完全相同的输入,确定性函数总是返回相同的值。

  • 非确定性缓存: 针对非确定性函数(每次执行可能给出不同的结果),需要判断缓存值的有效时间,在定义的时间段过去后所存储的结果被认为是陈旧的,需要刷新缓存值。

适合使用缓存的场景
  • 查询数据库的可调用项的结果

  • 渲染为静态值的可调用项的结果:如文件内容、Web请求、PDF渲染

  • 执行复杂计算的确定性可调用对象的结果

  • 全局映射,用于跟踪到期时间的值,如Web会话对象

  • 需要经常和快速访问的结果

  • 保存通过Web服务获得的第三方API的结果,减少网络延迟,提高性能并且节省费用。

如何缓存

简单的方法:进程空间中保存的全局数据结构,如dict

复杂:设置专门的缓存服务

内置函数

functools.lru_cache

functools — Higher-order functions and operations on callable objects — Python 3.12.3 documentation

代码示例

以递归计算斐波那契数列的函数为例,不实用缓存时,平均每次运算耗时0.12s

from time import perf_counter
def fib(n):
    if n <= 1:
        return n
    return fib(n-1) + fib(n-2)

if __name__ == '__main__':
    count = 10
    start = perf_counter()
    for _ in range(count):
        print(fib(30))
    print(f"Time: {(perf_counter() - start)/count}")

若使用lru_cache(最近最少使用缓存,LRU),由于避免了多次耗时的重复计算,效率大幅提高

# @Author: weirdgiser
# @Time: 2024/5/19
# @Function:
from functools import lru_cache
from time import perf_counter
@lru_cache(maxsize=10)
def fib(n):
    if n <= 1:
        return n
    return fib(n-1) + fib(n-2)

if __name__ == '__main__':
    count = 10
    start = perf_counter()
    for _ in range(count):
        print(fib(30))
    print(f"Time: {(perf_counter() - start)/count}")

缓存服务
  • Memcached
CoolCats
CoolCats
理学学士

我的研究兴趣是时空数据分析、知识图谱、自然语言处理与服务端开发