Để đánh giá tốc độ thực thi, chúng tôi sẽ sử dụng thư viện timeit.
import timeit
import numpy as np
setup = """
import numpy as np
tmp = np.empty(shape=(1, 100))
values = [i for i in xrange(100)]
"""
stmt1 = """tmp[0, :] = values"""
stmt2 = """
for i, val in enumerate(values):
tmp[0, i] = val
"""
time1 = timeit.Timer(setup=setup, stmt=stmt1)
time2 = timeit.Timer(setup=setup, stmt=stmt2)
print "numpy way :", time1.timeit(number=100000)
print "Python way:", time2.timeit(number=100000)
Bạn có thể kiểm tra điều này và bạn sẽ nhận thấy rằng vòng NumPy là hai lần nhanh hơn:
- numpy way : 0.97758197784423828
- Python way: 2.1633858680725098
Đây là bởi vì có một giai đoạn mà các số nguyên trong values
(mà là các số nguyên không giới hạn) được chuyển đổi thành nổi 64 bit. Để so sánh chỉ tốc độ của các vòng, việc chuyển đổi loại hình có thể được thực hiện sơ bộ trong thiết lập:
values = np.array([i for i in xrange(100)], dtype=np.float64)
Dưới đây là những gì tôi thu được:
numpy way : 0.131125926971
Python way: 2.64055013657
Chúng tôi nhận thấy rằng vòng NumPy là 20 lần nhanh hơn so với vòng lặp Python.
Bạn sẽ tìm thấy nhiều thông tin nếu bạn tìm kiếm vectorized computations in Python ...
'numpy' là mã nguồn mở, nếu bạn quan tâm đến cách một cái gì đó được thực hiện * * chỉ cần nhìn vào các nguồn. – Bakuriu
Câu trả lời là "nó phụ thuộc". Tìm trong 'core/src/multiarray/sequence.c' trong phân phối Numpy (' array_assign_slice': https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/sequence.c#L91). Trong ví dụ của bạn, tôi nghĩ rằng mã sẽ không chuyển đổi danh sách thành một mảng, nhưng tùy thuộc vào các trường hợp khác, nó có thể. –
@goncalopp yes i am lo ngại về việc sử dụng bộ nhớ. – methane