images
12/10/2020 02:46 am

Tại sao numpy được sử dụng nhiều trong các thư viện data mining?

Python có rất nhiều thư viện dành cho việc xử lý dữ liệu, và có sự khác biệt trong cách dùng. Thế nhưng hầu hết các thư viện đều sử dụng Numpy. Điều này khiến cho Gấu Mèo rất tò mò.

Sau một hồi đấu tranh tư tưởng, nó bắt đầu research tìm hiểu tại sao, mặc cho mấy trận ngoại hạng Anh níu kéo.


Data mining thì dữ liệu thường được biểu diễn dưới dạng vector nhiều chiều, thế nhưng core python thì chưa hỗ trợ nhiều cho các tính toán loại này. Python có thể tạo mảng, nhiều chiều cũng được, thậm chí là một lúc chứa nhiều kiểu dữ liệu khác nhau. Thế nhưng tính toán trên đấy thì khá chậm. Numpy giải quyết được vấn đề đấy, việc select hay thực hiện các phép tính linear algebra cũng thuận tiện hơn rất nhiều.


Nhưng  cứ thử kiểm chứng xem nó nhanh hơn như thế nào.Trước hết chúng ta sẽ khởi tạo chung một array để chuẩn bị cho việc  tính toán:


import numpy as np

big_array = np.random.randint(1, 100, size=1000000)


Chúng ta sẽ so sánh dựa trên hai đoạn code:


1. Dùng python:

%timeit sum(big_array)


2. Dùng hàm của numpy

%timeit np.sum(big_array)


Kết quả thu được:

Với cách 1: 144 ms ± 4.19 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

Với cách 2: 481 µs ± 8.56 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)


Cách 2 thực tế đã nhanh hơn rất nhiều, như thể Numpy thực hiện tính song song trên tất cả các phần tử của mảng chứ không phải  tính tuần tự như vòng loop của python vậy. 


Để đạt được điều này, Numpy dựa trên 2 yếu tố: cách lưu trữ biến trong bộ nhớ và cách thực hiện các phép tính.


Các phần tử trong Array của Numpy đều có cùng một kiểu dữ liệu, nghĩa là có cùng số ô nhớ để lưu các phần tử trong memory. Bởi vậy nó biết chính xác vị trí của của các ô nhớ để truy cập các phần tử dễ dàng. Array của python thì linh hoạt về kiểu dữ liệu. Đánh đổi lại nó truy cập phần tử chậm hơn, bởi vì nó không thể biết địa chỉ của phần tử thứ n nếu chưa kiểm tra kiểu dữ liệu của n -1 phần tử trước nó.


Về tính toán, Numpy sử dụng UFunc, một dạng vectorized operation. Cụ thể hơn thì các CPU và đặc biệt GPU hiện nay hỗ trợ SIMD (Single instruction, multiple data), giúp cho chúng ta có thể tính toán song song cùng một phép toán với nhiều giá trị khác nhau. Các CPU thế hệ càng mới, số lượng giá trị có thể tính toán song song trong một nhịp clock càng nhiều hơn. Numpy đã sử dụng nó cho việc tính toán khiến cho tốc độ được cải thiện rất nhiều.


Trước giờ Gấu Mèo cũng chỉ nghe nói và biết thế thôi chứ chưa kiểm chứng bao giờ. Một số dự án trước mà biết tính toán parallelism kiểu này thì đã tăng perfomance lên nhiều rồi. May mắn Numpy có support để chúng ta build những function như vậy. Gấu Mèo sẽ xem tiếp và chia sẻ lại. Hẹn gặp lại các bạn trong bài tiếp theo nhé.


Mời các bạn đọc thêm bài Lập trình đa luồng với Python.


Bạn muốn học Python, cùng tham khảo khóa học này nhé Python cơ bản và ứng dụng thực tế.


- Tech Zone -


Thư giãn chút nào!!!

Bài viết liên quan