Tôi sẽ chia câu trả lời của tôi thành ba phần. Cấu hình, tăng tốc mã python qua c và tăng tốc python qua python. Theo quan điểm của tôi, Python có một số công cụ tốt nhất để xem hiệu suất của mã của bạn sau đó đi sâu vào cổ chai thực tế. Tăng tốc mã mà không cần hồ sơ cũng giống như cố gắng giết một con nai bằng uzi.
Nếu bạn thực sự chỉ quan tâm đến các sản phẩm mat-vec, tôi sẽ khuyên bạn nên dùng scipy.spude .
Các công cụ Python để định hình
mô-đun cấu hình và cProfile : Các mô-đun này sẽ cung cấp cho bạn phân tích thời gian chạy tiêu chuẩn và ngăn xếp cuộc gọi chức năng. Thật tuyệt khi lưu số liệu thống kê của họ và sử dụng mô-đun pstats, bạn có thể xem dữ liệu theo một số cách.
kernprof : công cụ này tập hợp nhiều thói quen để thực hiện những việc như định tuyến theo dòng mã
memory_profiler : công cụ này tạo ra dòng in chân bộ nhớ theo mã của bạn.
Bộ định thời IPython :timeit
Chức năng này khá hay để thấy sự khác biệt trong các chức năng theo cách tương tác nhanh.
Tăng tốc Python
Cython : cython là cách nhanh nhất để có một vài chức năng trong python và nhận mã nhanh hơn. Bạn có thể trang trí chức năng với biến thể cython của python và nó tạo mã c. Điều này rất dễ duy trì và cũng có thể liên kết với mã viết tay khác trong c / c ++ / fortran khá dễ dàng. Đó là công cụ ưa thích ngày nay.
ctypes : ctypes sẽ cho phép bạn viết các hàm của mình trong c và sau đó gói chúng nhanh chóng với cách trang trí mã đơn giản của nó. Nó xử lý tất cả sự đau đớn của việc truyền từ PyObjects và quản lý gil để gọi hàm c.
Các cách tiếp cận khác tồn tại để viết mã của bạn bằng C nhưng tất cả chúng đều có phần hơn để lấy thư viện C / C ++ và gói nó trong Python.
Phương pháp tiếp cận chỉ dành cho Python
Nếu bạn muốn ở bên trong Python, lời khuyên của tôi là tìm ra dữ liệu nào bạn đang sử dụng và chọn các loại dữ liệu chính xác để thực hiện các thuật toán của bạn. Theo kinh nghiệm của tôi, bạn thường sẽ nhận được nhiều hơn nữa bằng cách tối ưu hóa cấu trúc dữ liệu của bạn sau đó bất kỳ hack c cấp thấp nào. Ví dụ:
numpy : một mảng dự phòng rất nhanh cho các hoạt động được thực hiện của các mảng
numexpr : một trình tối ưu hóa biểu thức mảng numpy. Nó cho phép các biểu thức mảng numpy đa luồng và cũng thoát khỏi vô số lỗi tạm thời do các hạn chế của trình thông dịch Python.
blist : một triển khai b-cây của một danh sách, rất nhanh để chèn, lập chỉ mục và di chuyển các nút bên trong của danh sách
gấu trúc : khung dữ liệu (hoặc bảng) phân tích rất nhanh trên các mảng.
pytables : các bảng phân cấp có cấu trúc nhanh (như hdf5), đặc biệt tốt cho các tính toán và truy vấn cốt lõi đối với dữ liệu lớn.