Python配置文件快速查找物质实现方案
一、需求分析
在实际开发中,我们经常需要根据物质的特性值(如分子量、沸点、熔点等)在配置文件中快速查找对应的物质信息。这种场景常见于化学数据库、材料管理系统等领域。
二、解决方案设计
基于性能考虑,我们可以采用以下两种主要方案:
方案一:使用JSON配置文件+二分查找(适合有序数据)
方案二:使用SQLite数据库(适合频繁查询和大量数据)
三、具体实现
方案一:JSON配置文件+二分查找
此方案适用于数据量不大且特性值有序的情况。
1. 准备配置文件
创建substances.json文件:
[
{"name": "水", "molecular_weight": 18.015, "boiling_point": 100},
{"name": "乙醇", "molecular_weight": 46.07, "boiling_point": 78.37},
{"name": "甲醇", "molecular_weight": 32.04, "boiling_point": 64.7},
{"name": "乙酸", "molecular_weight": 60.05, "boiling_point": 118.1}
]2. 实现二分查找算法
import json
class SubstanceFinder:
def __init__(self, config_file):
with open(config_file, 'r', encoding='utf-8') as f:
self.substances = json.load(f)
# 按分子量排序
self.substances.sort(key=lambda x: x['molecular_weight'])
def binary_search(self, target_value, key='molecular_weight'):
"""二分查找"""
low, high = 0, len(self.substances) - 1
while low <= high:
mid = (low + high) // 2
current_value = self.substances[mid][key]
if abs(current_value - target_value) < 1e-6: # 处理浮点数精度
return self.substances[mid]
elif current_value < target_value:
low = mid + 1
else:
high = mid - 1
return None
def find_by_molecular_weight(self, weight):
return self.binary_search(weight, 'molecular_weight')
def find_by_boiling_point(self, temp):
return self.binary_search(temp, 'boiling_point')
# 使用示例
finder = SubstanceFinder('substances.json')
result = finder.find_by_molecular_weight(46.07)
print(result) # {'name': '乙醇', 'molecular_weight': 46.07, 'boiling_point': 78.37}方案二:SQLite数据库方案
此方案更适合大数据量和频繁查询的场景。
1. 创建数据库和表
import sqlite3
def init_database():
conn = sqlite3.connect('substances.db')
cursor = conn.cursor()
# 创建表
cursor.execute('''
CREATE TABLE IF NOT EXISTS substances (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
molecular_weight REAL,
boiling_point REAL,
melting_point REAL
)
''')
# 插入示例数据
substances = [
('水', 18.015, 100, 0),
('乙醇', 46.07, 78.37, -114.1),
('甲醇', 32.04, 64.7, -97.6),
('乙酸', 60.05, 118.1, 16.6)
]
cursor.executemany(
'INSERT INTO substances (name, molecular_weight, boiling_point, melting_point) VALUES (?, ?, ?, ?)',
substances
)
conn.commit()
conn.close()
init_database()2. 实现数据库查询类
import sqlite3 class DatabaseSubstanceFinder: def __init__(self, db_file='substances.db'): self.conn = sqlite3.connect(db_file) self.conn.row_factory = sqlite3.Row # 使返回结果支持字典式访问 def find_by_molecular_weight(self, weight, tolerance=0.01): """根据分子量查找,允许一定的误差范围""" cursor = self.conn.cursor() query = ''' SELECT * FROM substances WHERE ABS(molecular_weight - ?) <= ? ''' cursor.execute(query, (weight, tolerance)) results = [dict(row) for row in cursor.fetchall()] return results def find_by_boiling_point(self, temp, tolerance=0.5): """根据沸点查找""" cursor = self.conn.cursor() query = ''' SELECT * FROM substances WHERE ABS(boiling_point - ?) <= ? ''' cursor.execute(query, (temp, tolerance)) results = [dict(row) for row in cursor.fetchall()] return results def close(self): self.conn.close() # 使用示例 finder = DatabaseSubstanceFinder() results = finder.find_by_molecular_weight(46.07) for result in results: print(dict(result)) finder.close()
四、性能对比与选择建议
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| JSON+二分查找 | 实现简单,无需额外依赖 | 数据量大时性能下降,不支持复杂查询 | 小数据量,简单查询 |
| SQLite数据库 | 查询性能好,支持复杂条件,数据持久化 | 需要额外的数据库操作知识 | 大数据量,频繁查询,复杂条件 |
五、扩展优化
索引优化:对SQLite中的常用查询字段创建索引
缓存机制:对频繁查询结果进行缓存
模糊查询:支持按物质名称的部分匹配查询
多条件查询:支持同时按多个特性值进行筛选
根据实际项目需求选择合适的方案,对于大多数应用场景,SQLite数据库方案提供了更好的性能和扩展性。