基于Python 3的SMILES字符串最大数字快速查找方案问询
寻找SMILES字符串中最大数字的最优实现方案
我正在处理SMILES(分子的字符串表示格式,使用配对数字表示环结构),数据集规模达190万条字符串。通过SMILES随机化的数据增强流程,每条原始SMILES可生成多达3万条等效字符串,最终待处理字符串量接近1000亿条。需要找到最快的方法在SMILES字符串中查找最大数字。
需考虑的SMILES特性:
- 数字"0"始终被排除,目前未发现超过6的数字,但理论上可达9
- 部分SMILES无环结构,不含数字
已测试的实现函数
函数1:遍历字符逐个判断
def find_biggest_digits_1(smiles=str()): """ 遍历SMILES字符串,判断字符是否为数字,转成整数后记录最大值 """ max_digit = 0 for character in smiles: if character.isdigit(): digit = int(character) if digit > max_digit: max_digit = digit return max_digit
函数2:从大到小检查数字是否存在
def find_biggest_digits_2(smiles=str()): """ 从9到1依次检查数字是否存在于字符串中,找到第一个存在的数字即为最大值 """ max_digit = 0 for i in range(1,10): digit = 10 - i if smiles.find(str(digit)) != -1: max_digit = digit break return max_digit
性能测试结果
单条SMILES测试
- 函数1:2.14µs±64ns
- 函数2:1.96µs±78.2ns
多进程处理190万条数据
- 函数1:1.37s±69ms
- 函数2:1.34s±50.8ms
已尝试的优化方案
优化方案1(find_biggest_digits_1_b):找到9时提前终止
- 单条测试耗时:2.12µs±30.5ns
- 多进程处理耗时:1.42s±77.3ms
优化方案2(find_biggest_digits_3):生成器+try-except实现
- 单条测试耗时:2.51µs±83.8ns
- 多进程处理耗时:1.5s±92ms
现寻求性能更优的实现方案。
内容的提问来源于stack exchange,提问作者Etienne Reboul
相关产品推荐
相关产品推荐

