优化 Python 内存占用可以从代码层面、数据结构、运行环境、工具分析等多个角度入手。下面按实用程度分层说明,并给出示例。
在优化前,一定要先量化内存使用:
memory_profiler:逐行分析内存pip install memory-profiler
from memory_profiler import profile
@profile
def foo():
a = [i for i in range(10**6)]
return a
sys.getsizeof():看对象大小import sys
print(sys.getsizeof([1,2,3]))
tracemalloc:定位内存分配来源import tracemalloc
tracemalloc.start()
# ...
snapshot = tracemalloc.take_snapshot()
# 占用大
nums = [i*i for i in range(10**7)]
# 优化
nums = (i*i for i in range(10**7))
array 代替 listfrom array import array
a = array('i', range(1000000))
numpy.ndarray(数值计算)import numpy as np
a = np.arange(10**6, dtype=np.int32)
tuple 比 list 省point = (1, 2)
b = a[:] # 复制
b = a # 引用
df_view = df.loc[:, ['col1']]
del large_list
import gc
gc.collect()
def process():
big = load_big()
result = big[:10]
return result
# big 在函数结束自动释放
__slots__ 减少对象开销class Point:
__slots__ = ['x', 'y']
def __init__(self, x, y):
self.x = x
self.y = y
namedtuple / dataclass(slots=True)from dataclasses import dataclass
@dataclass(slots=True)
class User:
id: int
name: str
with open('big.txt') as f:
for line in f:
process(line)
for chunk in pd.read_csv('big.csv', chunksize=10000):
process(chunk)
resource.setrlimit(Linux)mmap 处理超大文件import mmap
with open('big.bin', 'rb') as f:
m = mmap.mmap(f.fileno(), 0, prot=mmap.PROT_READ)
pypy:自动优化内存 & 速度Cython / Rust 扩展sqlite / hdf5 代替内存数据functools.lru_cache(maxsize=...))如果你愿意,可以告诉我:
我可以给你 针对性优化方案或代码重构示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。