2012-03-22 53 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