2012-03-22 16 views

Odpowiedz

13

Najszybszym sposobem jest użycie metody numpy.fromstring:

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

+1: Zdecydowanie najszybszy jeszcze. – DSM

+0

dlaczego nie myślę o tym ..: P – wim

+0

Dziękuję bardzo .. Dość sprawny od obliczania czasu @bernie .. :) –

5

Spróbuj tego:

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

... Zakładając, że numery są ints. jeśli nie, zastąp int przez float w powyższym fragmencie kodu.

EDIT 1:

Alternatywnie, można to zrobić, stworzy tylko jeden listy pośredni (jednej generowane przez split()):

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

EDIT 2:

A jeszcze inny sposób, prawdopodobnie szybciej (dzięki za wszystkie komentarze, chłopaki!):

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

Problem z tym i s generuje listę w pamięci wszystkich części ciągu. Jeśli naprawdę jest 50 milionów części, to jest dużo dodatkowej pamięci na tymczasową listę. –

+0

@AdamMihalcin, który naprawdę zależy od wersji Pythona w użyciu. W Pythonie 3 lista jest leniwie oceniana i nie są tworzone listy pośrednie. Ponadto PO powiedział, że funkcja będzie nazywać się 50 milionów razy, a nie, że na liście znajduje się 50 milionów elementów. –

+1

@AdamMihalcin Nawet jeśli używasz wyrażenia "imap" lub generatora? Oscar - Na Pythonie 3, zrozumienie listy nadal stworzy listę pośrednią. – agf

7

@jterrace wygrywa jeden (1) internet.

W poniższych wymiarach przykładowy kod został skrócony, aby umożliwić testom dopasowanie do jednej linii bez przewijania tam, gdzie to możliwe.

Dla osób niezaznajomionych z timeitthe -s flag allows you to specify a bit of code which will only be executed once.


najszybszy i najmniej zaśmiecone sposobem jest użycie numpy.fromstring jak jterrace zasugerował:

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

Poniższe trzy przykłady użyć string.split w połączeniu z innym narzędziem.

string.split z numpy.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.split z int() obsady za pośrednictwem generatora ekspresji

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 z NumPy tablicy typu 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 Uwielbiam wygrywać w Internecie :) – jterrace

+0

o wiele lepsze wyjaśnienie na temat różnicy prędkości! –

Powiązane problemy