Python加速从超大字符串中检索数据

2024-04-26 08:04:44 发布

您现在位置:Python中文网/ 问答频道 /正文

往下看:

我有一个列表,当我试图编辑它时,我把它转换成一个很长的字符串,因为你可以收集到它叫做tempString。它现在起作用只是需要很长时间才能运行,可能是因为它是几个不同的regex sub。具体如下:

tempString = ','.join(str(n) for n in coords)
tempString = re.sub(',{2,6}', '_', tempString)
tempString = re.sub("[^0-9\-\.\_]", ",", tempString)
tempString = re.sub(',+', ',', tempString)
clean1 = re.findall(('[-+]?[0-9]*\.?[0-9]+,[-+]?[0-9]*\.?[0-9]+,'
                 '[-+]?[0-9]*\.?[0-9]+'), tempString)
tempString = '_'.join(str(n) for n in clean1)
tempString = re.sub(',', ' ', tempString)

基本上,它是一个长字符串,包含逗号和大约100-500万组4个浮点/整数(两者都有可能混合):

^{pr2}$

我不需要/不想要的每个集合中的第四个数字,我基本上只是尝试将字符串拆分成一个列表,每个列表中有3个浮点数,每个浮点数用空格隔开。在

上面的代码可以完美地工作,但是正如您所想象的那样,在大型字符串上相当耗时。在

我在这里做了很多研究来寻找一个解决方案,但它们似乎都倾向于用词,即用一个词换另一个词。在


编辑: 好的,这就是我目前使用的解决方案:

^{3}$

有没有人有什么建议可以把这个速度再加快一点?在运行了一些测试之后,它仍然需要比我期望的长得多的时间。在

我一直在浏览numPy,但老实说,我完全不知道如何使用它上面的内容,我理解在完成了上面的操作并清理了这些值之后,我可以更有效地使用numPy,但不确定numPy如何应用于上面的内容。在

上面所说的清理5万台需要20分钟左右,我无法想象在我的100万台整串设备上要花多长时间。我只是惊讶于最初导出数据的程序在100万套数据中只花了30秒左右


Tags: 字符串inrenumpy编辑内容列表for
2条回答

根据您的样本数据:

>>> s = "-5.65500020981,6.88999986649,-0.454999923706,1,,,-5.65500020981,6.95499992371,-0.454999923706,1,,,"
>>> def getValues(s):
...     output = []
...     while s:
...         # get the three values you want, discard the 3 commas, and the 
...         # remainder of the string
...         v1, v2, v3, _, _, _, s = s.split(',', 6)
...         output.append("%s %s %s" % (v1, v2, v3))
...         
...     return output
>>> getValues(s)
['-5.65500020981 6.88999986649 -0.454999923706', '-5.65500020981 6.95499992371 -0.454999923706']

…一旦将这些解析后的值作为字符串放入列表中,您就可以执行任何其他需要执行的操作。在

或者,如果愿意,可以使用生成器,这样就不需要一次生成整个返回字符串:

^{pr2}$

您可能还想尝试一种方法,在,,,一组逗号上预拆分长列表,而不是不断地构建和处理一组较短的字符串,例如:

>>> def getValues(s):
...     # split your long string into a list of chunked strings
...     strList = s.split(",,,")
...     for chunk in strList:
...         if chunk:
...         # ...then just parse apart each individual set of data values
...             vals = chunk.split(',')
...             yield "%s %s %s" % (vals[0], vals[1], vals[2])
>>> for v in getValues(s10):
...     print v
-5.1  6.8  -0.454
-5.1  6.8  -0.454
-5.1  6.8  -0.454
-5.1  6.8  -0.454
-5.1  6.8  -0.454
-5.1  6.8  -0.454
-5.1  6.8  -0.454
-5.1  6.8  -0.454
-5.1  6.8  -0.454
-5.1  6.8  -0.454

在某种程度上,当你处理像这样的大数据集并且有速度问题时,把事情向下推到在C中做艰苦工作的模块,比如NumPy,是有意义的。在

减少内存消耗而不必更改regex中的任何内容的一种方法是使用re.finditer()方法而不是re.findall()。这将逐个迭代这些值,而不是将整个字符串读入单个列表对象。http://docs.python.org/library/re.html#re.finditer

相关问题 更多 >