2011-12-02 41 views
5

Tôi đã thấy các câu hỏi tương tự như vậy, nhưng không phải là một trong những địa chỉ trực tiếp giải quyết vấn đề. Tôi đã hẹn giờ hai cách sau đây để điền vào mảng và một nửa thời gian bằng cách sử dụng np.zeros() nhanh hơn và một nửa thời gian thực hiện trực tiếp nhanh hơn. Có cách nào thích hợp hơn không? Tôi khá mới để sử dụng mảng numpy, và đã tham gia với mục đích tăng tốc mã của tôi thay vì không có quá nhiều suy nghĩ để dễ đọc.cách nhanh nhất để điền một mảng numpy 1D

import numpy as np 
import time 

lis = range(100000) 

timer = time.time() 
list1 = np.array(lis) 
print 'normal array creation', time.time() - timer, 'seconds' 

timer = time.time() 
list2 = np.zeros(len(lis)) 
list2.fill(lis) 
print 'zero, fill - array creation', time.time() - timer, 'seconds' 

Cảm ơn bạn

+0

Cách pythonic đến tốc độ thực hiện benchmark được sử dụng [ 'timeit'] (http://docs.python.org /library/timeit.html) mô-đun. – mac

+0

@mac ok Tôi sẽ sử dụng từ bây giờ. Đây là khá nhiều lần đầu tiên/hồ sơ (cProfiler) Tôi cần thiết để thời gian chức năng của tôi – Anake

Trả lời

5

Nếu bạn có một danh sách nổi a=[x/10. for x in range(100000)], sau đó bạn có thể tạo một mảng với:

np.array(a) # 9.92ms 
np.fromiter(a, dtype=np.float) # 5.19ms 

cách tiếp cận của bạn

list2 = np.zeros(len(lis)) 
list2.fill(lis) 

sẽ không hoạt động như mong đợi. .fill lấp đầy toàn bộ mảng bằng một giá trị.

+0

xin lỗi đã được rõ ràng hơn, mã này chỉ là để thử nghiệm tốc độ, nó sẽ được lấp đầy với dữ liệu thực tế khi tôi sẽ sử dụng nó . (các điểm dữ liệu sẽ được thả nổi) – Anake

+1

Đối với 'np.array' so với' np.fromiter', tôi ngạc nhiên là thứ hai nhanh hơn. Nếu đó là một iterator numpy sẽ không biết bao nhiêu bộ nhớ để phân bổ lúc đầu tiên. (Nó phải được kiểm tra nếu nó có thể có được một chiều dài.) Hiệu suất tốt hơn là bởi vì bạn đang nói numpy loại rõ ràng để sử dụng. Nếu bạn đã chuyển dtype thành 'np.array' sẽ vẫn nhanh hơn. – AFoglia

1

Ví dụ list2 của bạn chỉ đơn giản là không hoạt động — nếu bạn kiểm tra list2, bạn sẽ thấy rằng nó vẫn chứa tất cả các số không. Tôi thấy rằng việc theo đuổi khả năng đọc không chỉ là một mục tiêu tốt trong chính bản thân nó. Nó cũng làm tăng khả năng mã đúng.

+3

Phải là một bình luận ... :) – mac

+0

Rất tiếc, đã không thực sự kiểm tra xem nó có hoạt động hay không. Cảm ơn vì điều đó – Anake

1

Danh sách đầu tiên có thể được tạo ra nhanh hơn với chức năng arange NumPy:

list3 = np.arange(100000)

Bạn cũng có thể thấy hữu ích các linspace chức năng.

2

np.fromiter sẽ sẵn bố trí các mảng đầu ra nếu có số yếu tố:

a = [x/10. for x in range(100000)] # 10.3ms 
np.fromiter(a, dtype=np.float) # 3.33ms 
np.fromiter(a, dtype=np.float, count=100000) # 3.03ms 
Các vấn đề liên quan