数据结构初始化:避免“动态陷阱”
Python的动态特性虽灵活,但不当初始化易导致性能或逻辑问题。以下以NumPy和Pandas为例:
NumPy矩阵初始化的学问
创建全1矩阵时,dtype参数决定数据类型,直接影响后续计算:
import numpy as np
# ❌ 错误:未指定dtype,可能默认int32
arr1 = np.ones((3, 3))
print(arr1.dtype) # int64(某些系统)→ 浮点计算时精度损失
# ✅ 正确:显式指定为float64
arr2 = np.ones((3, 3), dtype=np.float64)
print(arr2.dtype) # float64 → 精度保障
在图像处理(OpenCV)中,错误的dtype会导致像素值溢出:
img = np.zeros((100, 100), dtype=np.uint8) # uint8范围[0,255]
img[0, 0] = 300 # 实际值为300 % 256 = 44 → 数据失真
文件与资源初始化:上下文管理器的妙用
文件操作的初始化需谨慎处理异常与资源释放。推荐使用with语句:
def init_config(filepath):
try:
with open(filepath, 'r', encoding='utf-8') as f:
config = json.load(f)
return config
except FileNotFoundError:
# 初始化默认配置
return {"debug": False, "timeout": 30}
except json.JSONDecodeError:
print(f"配置文件{filepath}格式错误,使用默认配置")
return {"debug": False, "timeout": 30}
# 使用
app_config = init_config("config.json")
若手动打开文件,需确保finally块中关闭句柄,否则可能资源泄漏。
命令行参数初始化:argparse的完整示例
使用argparse初始化程序参数,支持默认值与类型校验:
import argparse
def parse_args():
parser = argparse.ArgumentParser(
description="数据处理工具 - 支持批量文件转换"
)
parser.add_argument(
"-i", "--input",
required=True,
help="输入文件路径"
)
parser.add_argument(
"-o", "--output",
default="output.csv",
help="输出文件路径(默认:output.csv)"
)
parser.add_argument(
"--batch-size",
type=int,
default=1000,
help="批处理大小(默认:1000)"
)
parser.add_argument(
"--verbose",
action="store_true",
help="启用详细日志"
)
return parser.parse_args()
# 初始化配置
args = parse_args()
if args.verbose:
print(f"输入: {args.input}, 输出: {args.output}, 批大小: {args.batch_size}")
运行示例:python script.py -i data.json --batch-size 500
数据库连接池初始化:生产级实践
使用SQLAlchemy初始化连接池,支持连接复用与自动重连:
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
# 初始化连接池(带连接池配置)
engine = create_engine(
"postgresql://user:pass@localhost/db",
pool_size=10, # 连接池大小
max_overflow=5, # 最大溢出连接数
pool_timeout=30, # 获取连接超时(秒)
pool_recycle=1800 # 连接回收时间(秒)
)
# 初始化会话
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
# 使用
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close() # 自动释放连接
此模式确保数据库连接高效复用,避免频繁创建/销毁连接的开销。
配置文件初始化:YAML的动态加载
使用yaml加载配置,并支持环境变量覆盖:
import yaml
import os
def load_config(config_path="config.yaml"):
with open(config_path) as f:
config = yaml.safe_load(f)
# 允许环境变量覆盖
for key in ["DATABASE_URL", "API_KEY"]:
if os.getenv(key):
config[key.lower()] = os.getenv(key)
return config
# 示例config.yaml
# database_url: "sqlite:///app.db"
# api_key: "secret123"
# 初始化
app_config = load_config()
print(app_config["database_url"]) # 支持环境变量覆盖