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
相关产品推荐
相关产品推荐

