Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 标记信号的最快方法?_Python_Performance_Tokenize - Fatal编程技术网

Python 标记信号的最快方法?

Python 标记信号的最快方法?,python,performance,tokenize,Python,Performance,Tokenize,我需要找到最快的方式来标记信号。信号的形式如下: 标识符:值标识符:值标识符:值。。。 标识符仅由字母数字和下划线组成标识符与上一个值之间用空格分隔。值可能包含字母数字、各种大括号/方括号和空格 e、 g。 信号标识:调试字12标识数据:{}虚拟接口标识:0x0000模块标识:0x0001模块子标识:0x0016时间戳:0xcc557366调试字:[0x0006 0x0006 0x0000 0x0000 0x0000 0x0000 0xcc55 0x70a9 0x4c55 0x7364 0x

我需要找到最快的方式来标记信号。信号的形式如下:

标识符:值标识符:值标识符:值。。。
标识符
仅由字母数字和下划线组成<代码>标识符与上一个值之间用空格分隔。值可能包含字母数字、各种大括号/方括号和空格

e、 g。

信号标识:调试字12标识数据:{}虚拟接口标识:0x0000模块标识:0x0001模块子标识:0x0016时间戳:0xcc557366调试字:[0x0006 0x0006 0x0000 0x0000 0x0000 0x0000 0xcc55 0x70a9 0x4c55 0x7364 0x0000 0x0000 0x0000 0x0000]序列号:0x0174

我想到的最好的是下面。理想情况下,我希望将所需时间减半。我用正则表达式尝试过各种方法,但都没有更好的效果。有什么建议吗

# Convert data to dictionary. Expect data to be something like
# parameter_1:a b c d parameter_2:false parameter_3:0xabcd parameter_4:-56

# Split at colons. First part will be just parameter name, last will be just value
# everything in between will be <parameter name><space><value>
parts1 = data.split(":")
parts2 = []
for part in parts1:
    # Copy first and last 'as is'
    if part in (parts1[0], parts1[-1]):
        parts2.append(part)
    # Split everything in between at last space (don't expect parameter names to contain spaces)
    else:
        parts2.extend(part.rsplit(' ', 1))

# Expect to now have [parameter name, value, parameter name, value, ...]. Convert to a dict
self.data_dict = {}
for i in range(0, len(parts2), 2):
    self.data_dict[parts2[i]] = parts2[i + 1]
#将数据转换为字典。期望数据类似于
#参数_1:AB c d参数_2:false参数_3:0xabcd参数_4:-56
#在科隆分拆。第一部分将只是参数名,最后一部分将只是值
#中间的一切都会很好
parts1=数据。拆分(“:”)
第2部分=[]
对于零件中的零件1:
#复制第一个和最后一个“原样”
如果零件位于(零件1[0],零件1[-1]):
第2部分。追加(部分)
#在最后一个空格中拆分所有内容(不要期望参数名称包含空格)
其他:
第2部分延伸(第1部分断裂(“”,1))
#现在应该有[参数名、值、参数名、值,…]。转换成口述
self.data_dict={}
对于范围内的i(0,len(第2部分),2):
自我数据记录[parts2[i]]=parts2[i+1]

我对您的解决方案进行了一些优化:

1) 从循环中删除支票

2) 已更改字典创建代码:


我对您的解决方案进行了一些优化:

1) 从循环中删除支票

2) 已更改字典创建代码:


你考虑过PyParsing吗?但是如果格式足够简单的话,也许用Cython重写代码就可以了?但是如果格式足够简单的话,也许用Cython重写代码就可以了。谢谢。不幸的是,这对处理时间没有真正的影响。@quite68我通过将
数据
字符串重复10万次,得到了
0735s
。使用my-
0568S
。我使用Linux
time./source.py
命令进行测试。因此,30%的收益。我的测试与你的不同。我将这两段代码放在单独的例程中,并调用了这些例程。当我早些时候这样做的时候,你的代码有时更快,有时更慢——但我使用的是虚拟机。我现在用NUC和您一样使用时间重复了一遍,您的代码大约快了15%。我会给你一个提升,但我没有足够的代表点。谢谢你。不幸的是,这对处理时间没有真正的影响。@quite68我通过将
数据
字符串重复10万次,得到了
0735s
。使用my-
0568S
。我使用Linux
time./source.py
命令进行测试。因此,30%的收益。我的测试与你的不同。我将这两段代码放在单独的例程中,并调用了这些例程。当我早些时候这样做的时候,你的代码有时更快,有时更慢——但我使用的是虚拟机。我现在用NUC和您一样使用时间重复了一遍,您的代码大约快了15%。我会给你一个提升,但我没有足够的代表点。
parts1 = data.split(":")

parts2 = []
parts2.append(parts1.pop(0))

for part in parts1[0:-1]:
    parts2.extend(part.rsplit(' ', 1)) 

parts2.append(parts1.pop())


data_dict = {k : v for k, v in zip(parts2[::2], parts2[1::2])}