Tôi đang sử dụng hàm numpy.array() để tạo các lệnh ndd từ numpy.float64 từ danh sách.Tại sao numpy.array() đôi khi rất chậm?
Tôi nhận thấy rằng điều này rất chậm khi danh sách chứa Không có hoặc danh sách danh sách được cung cấp.
Dưới đây là một số ví dụ với thời gian. Có cách giải quyết rõ ràng nhưng tại sao điều này quá chậm?
Ví dụ về danh sách các None:
### Very slow to call array() with list of None
In [3]: %timeit numpy.array([None]*100000, dtype=numpy.float64)
1 loops, best of 3: 240 ms per loop
### Problem doesn't exist with array of zeroes
In [4]: %timeit numpy.array([0.0]*100000, dtype=numpy.float64)
100 loops, best of 3: 9.94 ms per loop
### Also fast if we use dtype=object and convert to float64
In [5]: %timeit numpy.array([None]*100000, dtype=numpy.object).astype(numpy.float64)
100 loops, best of 3: 4.92 ms per loop
### Also fast if we use fromiter() insead of array()
In [6]: %timeit numpy.fromiter([None]*100000, dtype=numpy.float64)
100 loops, best of 3: 3.29 ms per loop
Ví dụ về danh sách liệt kê:
### Very slow to create column matrix
In [7]: %timeit numpy.array([[0.0]]*100000, dtype=numpy.float64)
1 loops, best of 3: 353 ms per loop
### No problem to create column vector and reshape
In [8]: %timeit numpy.array([0.0]*100000, dtype=numpy.float64).reshape((-1,1))
100 loops, best of 3: 10 ms per loop
### Can use itertools to flatten input lists
In [9]: %timeit numpy.fromiter(itertools.chain.from_iterable([[0.0]]*100000),dtype=numpy.float64).reshape((-1,1))
100 loops, best of 3: 9.65 ms per loop
để tạo ra một mảng trống rỗng, sử dụng 'a = numpy.empty (100000)'. Để tạo một mảng với tất cả các số không: 'a = numpy.zeros (100000)'. – jfs
Mục tiêu của tôi không phải là tạo ra một mảng số không hoặc rỗng, nhưng tôi đang gặp sự cố về hiệu suất khi Không có trong tập dữ liệu. Nếu tôi tạo mảng và đầu tiên và thiết lập các giá trị tôi có khá nhiều vấn đề tương tự. Trong [18]: a = numpy.empty ((100000,)) Trong [19]:% timeit a [:] = [None] * 100000 1 vòng, tốt nhất là 3: 209 ms mỗi vòng Trong [20]:% timeit a [:] = [0] * 100000 100 vòng, tốt nhất là 3: 9,59 ms mỗi vòng – MarkW
thực sự nó là một câu hỏi thú vị: tại sao '[3]' chậm hơn nhiều so với '[5 ] '(nó có thể là một lỗi hoặc chỉ là một trường hợp sử dụng hiếm hoi không được tối ưu hóa). Để lặp lại 'NaN', hãy gọi' numpy.repeat (float ("nan"), 100000) ' – jfs