You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python解析.h文件:单次读取实现多正则匹配优化

优化.h文件解析的Python代码效率问题

我正在编写Python代码来解析以下.h文件:

#include <limits.h> // Offsets // UINT_MAX == 4294967295 (Note: do not remove the comments, they are used by parser.py)
#define ID_OFFSET UINT_MAX - (1 << 6) // ID_OFFSET == 4294967231
#define CALL_NR_OFFSET ID_OFFSET - (1 << 20) // CALL_NR_OFFSET == 4293918655
// Range of lower 2^20 numbers is reserved for debug statements.
#define DEBUG_OFFSET (2 << 20) // DEBUG_OFFSET == 1048576
// IDs for jpeg library functions
#define INIT_HEADER_VLD_ID ID_OFFSET + 1
#define HEADER_VLD_ID ID_OFFSET + 2
#define IQZZ_ID ID_OFFSET + 3
#define IDCT_ID ID_OFFSET + 4
#define CC_ID ID_OFFSET + 5
#define RASTER_ID ID_OFFSET + 6
// Core frequencies
#define MB1_FREQ 2.5 // in Mhz
#define MB2_FREQ 2.5 // in Mhz
#define MB3_FREQ 3 // in Mhz
#define MB4_FREQ 3 // in Mhz

我定义了以下正则表达式和解析函数:

import re

uint_max_re = re.compile('UINT_MAX\\s+=+\\s+(\\d+)\\s+')
id_offset_re = re.compile('ID_OFFSET\\s+=+\\s+(\\d+)')
call_nr_offset_re = re.compile('CALL_NR_OFFSET\\s+=+\\s+(\\d+)')
debug_offset_re = re.compile('DEBUG_OFFSET\\s+=+\\s+(\\d+)')
function_ids_re = re.compile('#define\\s+(\\w+)\\s+ID_OFFSET\\s+\\+\\s+(\\d)')
core_freqs_re = re.compile('#define MB(\\d+)_FREQ\\s+(\\d[.\\d]*)')

def parse_wrapper_params():
    """This parses the wrapper_params.h file and returns a dictionary with function_id as key and function_name as value"""
    with open(wrapper_params_file, 'r') as f:
        uint_max = int(uint_max_re.findall(f.read())[0])
    with open(wrapper_params_file, 'r') as f:
        id_offset = int(id_offset_re.findall(f.read())[0])
    with open(wrapper_params_file, 'r') as f:
        call_nr_offset = int(call_nr_offset_re.findall(f.read())[0])
    with open(wrapper_params_file, 'r') as f:
        debug_offset = int(debug_offset_re.findall(f.read())[0])
    with open(wrapper_params_file, 'r') as f:
        function_ids = function_ids_re.findall(f.read())
    with open(wrapper_params_file, 'r') as f:
        core_freqs = core_freqs_re.findall(f.read())
    
    return {
        'uint_max': uint_max,
        'id_offset': id_offset,
        'call_nr_offset': call_nr_offset,
        'debug_offset': debug_offset,
        'function_ids': {int(id_offset) + int(function_id): function_name.lower() for function_name, function_id in function_ids},
        'core_freqs': {int(core): freq for core, freq in core_freqs}
    }

当前代码的问题是多次打开文件并执行findall操作,效率很低。我尝试改成仅通过一次with open(wrapper_params_file, 'r') as f:读取文件内容,然后对所有正则表达式使用该内容进行匹配,但合并后正则无法找到对应内容。恳请大家提供解决方案。


内容的提问来源于stack exchange,提问作者user165975

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:41:09