将字符串拆分为性能良好的dict



我搜索拆分长字符串的最佳方法,看起来像b'a: 1nb: 2n ...'-大约50-70个键。

字符串长度为8-10K字节。所以,我每秒大约有1K个字符串。

最佳方法看起来像:

dict(x.split(b": ") for x in bytes(headers).split(b'n'))

也许赛顿的成绩不错?

只要输入格式正确,我们就可以用相同的分隔符(n(替换:分隔符,并同时拆分两者,然后切片键/值。

代码看起来像:

def fast_split(data):
items = bytes(data).replace(b": ", b"n").split(b"n")
return dict(zip(items[::2], items[1::2]))

在我的机器上,它大约快3倍-

from timeit import timeit
size = 100000
test_str = b"n".join([b"a: 1"] * size)

def slow_split(data):
return dict(x.split(b": ") for x in bytes(data).split(b'n'))
def fast_split(data):
items = bytes(data).replace(b": ", b"n").split(b"n")
return dict(zip(items[::2], items[1::2]))
print(fast_split(test_str) == slow_split(test_str))
print(timeit("slow_split(test_str)", number=100, setup="from __main__ import slow_split, test_str"))
print(timeit("fast_split(test_str)", number=100, setup="from __main__ import fast_split, test_str"))
True
1.373571052972693
0.4970768200000748

:转换为n(并删除空格(只允许使用一个拆分操作。通过对'\n'进行拆分返回的每两个值进行配对,可以创建字典。

sep = bytes.maketrans(b':',b'n')
d = dict(zip(*[iter(s.translate(sep,b' ').split(b'n'))]*2))

假设只设置一次sep,这大约快2倍(在10000个不同的字典键上(。

也许您正在寻找这样的东西,它只会使用itertools来节省长字符串的内存,并且:

from itertools import pairwise

def string_to_dict(str_value):
#l is a list of indices of each 'n' inside the string ​
​l = []
​i = 0
​while i<len(str_value):
​if str_value[i] == b'n':l.append(i)
​i+=1
​#pairwise(l) will give us a list of 2-tuple indices to get each
# substring in the format 'key:value'
#str_value[x[0]+1:x[1]].split(b': ') will give us (key, value) tuple
#to dynamically create the global dict
result_dict = dict(str_value[x[0]+1:x[1]].split(b': ') for x in pairwise(l))
return result_dict

或者更高效,以下将以计算的价格节省内存

def string_to_dict(str_value):
w = (i for i in range(len(str_value)) if str_value[i]==b'n')
result_dict = dict(str_value[x[0]+1:x[1]].split(b': ') for x in pairwise(w))
return result_dict

最新更新