共享构建Python vs静态构建Python的优势是什么?为何测试未显内存节省?
共享构建Python与静态构建Python的内存优势疑问
Python默认会构建静态库libpythonMAJOR.MINOR.a并将其静态链接到解释器中,而使用--enable-shared参数时,会生成共享库libpythonMAJOR.MINOR.so.1.0并动态链接到解释器。
我最初的认知是:共享构建版本肯定能大幅节省内存!于是做了如下假设:
# 共享构建版本 34K Jun 29 11:32 python3.9 21M Jun 29 11:32 libpython3.9.so.1.0
10个共享Python进程的内存占用=0.034M*10+21M≈21M
# 静态构建版本 22M Jun 27 23:45 python3.9
10个静态Python进程的内存占用=10*22M=220M
按这个计算共享版本完胜!
但实际测试后发现这个假设不成立:
测试文件test.py代码:
import time i = 0 while i < 20: time.sleep(1) i += 1 print('done')
测试脚本mem_test.sh:
#! /bin/bash for i in {1..1000} do ./python3.9 test.py & done
运行共享版本时设置了export LD_LIBRARY_PATH=/home/tian/py3.9.13_share/lib,分别用两个版本运行脚本后,通过htop监控总内存占用,结果两者几乎一致。
后来了解到按需分页机制,才知道之前对静态Python内存占用的计算完全错误。
现在我有两个疑问:
- 共享构建Python对比静态构建Python的优势到底是什么?
- 还是共享构建确实能通过共享库节省部分内存,但我的测试场景太简单无法体现?
补充:
- 官方Python Dockerfile普遍使用
--enable-shared参数 - pyenv社区也有相关讨论,但暂无明确答案
内容的提问来源于stack exchange,提问作者Rick
相关产品推荐
相关产品推荐

