2012-03-22 54 views

回答

13

的最快方式是使用numpy.fromstring方法:

>>> import numpy 
>>> data = "1|234|4456|789" 
>>> numpy.fromstring(data, dtype=int, sep="|") 
array([ 1, 234, 4456, 789]) 
+2

+1:绝对是最快的呢。 – DSM 2012-03-22 03:46:24

+0

为什么我没有想到..:P – wim 2012-03-22 04:06:28

+0

非常感谢。..从@bernie时间计算非常高效.. :) – 2012-03-22 14:45:04

5

试试这个:

import numpy as np 
s = '1|234|4456|789' 
array = np.array([int(x) for x in s.split('|')]) 

...假设数字都是整数。如果不是,则在上面的代码片段中将int替换为float

EDIT 1:

另外,也可以做到这一点,这只会造成一个中间列表(一个由split()生成):

array = np.array(s.split('|'), dtype=int) 

编辑2:

另一种方式,可能更快(感谢所有的评论,家伙!):

array = np.fromiter(s.split("|"), dtype=int) 
+0

与此我的问题的NumPy的阵列它会生成一个字符串中所有部分的内存列表。如果真的有五千万个零件,那么对于一个临时列表来说,这是很多额外的内存。 – 2012-03-22 03:15:35

+0

@AdamMihalcin确实取决于正在使用的Python版本。在Python 3中,该列表将被懒惰地评估,并且不会创建中间列表。另外,OP表示该功能将被称为5000万次,而不是列表中有5000万个元素。 – 2012-03-22 03:19:54

+1

@AdamMihalcin即使你使用'imap'或者一个生成器表达式?奥斯卡 - 在Python 3上,列表理解仍然会创建一个中间列表。 – agf 2012-03-22 03:20:01

7

@jterrace胜一(1)网络连接。

在下面的测量中,缩短了示例代码,以便在可能的情况下使测试适合一条线而不滚动。

对于那些不熟悉timeitthe -s flag allows you to specify a bit of code which will only be executed once


最快和最不杂乱的方法是使用如numpy.fromstring建议jterrace:

python -mtimeit -s"import numpy;s='1|2'" "numpy.fromstring(s,dtype=int,sep='|')" 
100000 loops, best of 3: 1.85 usec per loop 

以下三个示例结合使用string.split与另一工具。

string.splitnumpy.fromiter

python -mtimeit -s"import numpy;s='1|2'" "numpy.fromiter(s.split('|'),dtype=int)" 
100000 loops, best of 3: 2.24 usec per loop 

string.splitint()经由发电机表达铸造

python -mtimeit -s"import numpy;s='1|2'" "numpy.array(int(x) for x in s.split('|'))" 
100000 loops, best of 3: 3.12 usec per loop 

string.split类型int

python -mtimeit -s"import numpy;s='1|2'" "numpy.array(s.split('|'),dtype=int)" 
100000 loops, best of 3: 9.22 usec per loop 
+5

+1我喜欢赢得互联网:) – jterrace 2012-03-22 04:21:25

+0

速度差异更好的解释! – 2013-02-07 16:52:11