2012-03-22 34 views

Trả lời

13

Cách nhanh nhất là sử dụng phương pháp numpy.fromstring:

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

+1: Chắc chắn là nhanh nhất. – DSM

+0

tại sao tôi không nghĩ về điều đó ..: P – wim

+0

Cảm ơn bạn rất nhiều .. Khá hiệu quả từ tính toán thời gian @bernie .. :) –

5

Hãy thử điều này:

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

... Giả sử rằng những con số đều ints. nếu không, hãy thay thế int bằng float trong đoạn mã trên.

EDIT 1:

Ngoài ra, bạn có thể làm điều này, nó sẽ chỉ tạo một danh sách trung gian (một trong những tạo ra bởi split()):

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

EDIT 2:

Và cách khác, có thể nhanh hơn (cảm ơn tất cả nhận xét, guys!):

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

Vấn đề với i này s nó tạo ra một danh sách trong bộ nhớ của tất cả các phần của chuỗi. Nếu có thực sự là 50 triệu phần, đó là rất nhiều bộ nhớ thêm cho một danh sách tạm thời. –

+0

@AdamMihalcin thực sự phụ thuộc vào phiên bản của Python được sử dụng. Trong Python 3, danh sách được đánh giá một cách lười biếng và không có danh sách trung gian nào được tạo ra. Ngoài ra, OP cho biết chức năng này sẽ được gọi là 50 triệu lần, không phải là có 50 triệu yếu tố trong danh sách. –

+1

@AdamMihalcin Ngay cả khi bạn sử dụng 'imap' hoặc biểu thức trình tạo? Oscar - Trên Python 3, việc hiểu danh sách vẫn sẽ tạo ra một danh sách trung gian. – agf

7

@jterrace thắng một (1) internet.

Trong các phép đo bên dưới mã ví dụ đã được rút ngắn để cho phép các phép thử vừa với một dòng mà không cần cuộn khi có thể.

Đối với những người không quen thuộc với timeitthe -s flag allows you to specify a bit of code which will only be executed once.


Cách nhanh nhất và ít nhất-lộn xộn là sử dụng numpy.fromstring như jterrace gợi ý:

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

Ba ví dụ sau đây sử dụng string.split kết hợp với công cụ khác.

string.split với 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 với int() cast qua máy phát-biểu

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 với NumPy mảng kiểu 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 Tôi thích chiến thắng trên internet :) – jterrace

+0

giải thích tốt hơn về sự khác biệt về tốc độ! –

Các vấn đề liên quan