Tôi biết đây là một chủ đề cũ hơn nhưng tôi muốn cung cấp những gì tôi nghĩ là thông tin hữu ích.
Cá nhân tôi sử dụng pypy thực sự dễ dàng cài đặt bằng PIP. Tôi có thể thay thế cho người phiên dịch python/pypy, bạn không cần phải thay đổi mã của mình và tôi thấy nó nhanh hơn khoảng 40 lần so với trình thông dịch Python tiêu chuẩn [có thể là Python 2x hoặc 3x]. Tôi sử dụng phiên bản cộng đồng Pycharm để quản lý mã của tôi và tôi thích nó.
Tôi thích viết mã bằng Python vì tôi nghĩ rằng nó cho phép bạn tập trung vào nhiệm vụ nhiều hơn ngôn ngữ, đây là một điểm cộng rất lớn đối với tôi. Và nếu bạn cần nó thậm chí còn nhanh hơn, bạn luôn có thể biên dịch thành nhị phân cho Windows, Linux hoặc Mac [không thẳng về phía trước nhưng có thể với các công cụ khác]. Từ kinh nghiệm của tôi, tôi nhận được khoảng 3,5 lần tăng tốc trên Pypy khi biên dịch, có nghĩa là nhanh hơn 140 lần so với Python. Pypy có sẵn cho mã Python 3x và 2x và một lần nữa nếu bạn sử dụng một IDE như Pycharm, bạn có thể trao đổi giữa nói Pypy, Cython và Python rất dễ dàng [mặc dù vậy, việc học và thiết lập ban đầu].
Một số người có thể tranh luận với tôi về điều này, nhưng tôi thấy Pypy nhanh hơn Cython. Nhưng cả hai đều là những lựa chọn tuyệt vời.
EDIT: Tôi muốn ghi chú nhanh khác về việc biên dịch: Khi bạn biên dịch, nhị phân kết quả lớn hơn nhiều so với tập lệnh Python của bạn vì nó xây dựng tất cả các phụ thuộc vào đó, v.v. Nhưng sau đó bạn nhận được một vài lợi ích khác biệt: tốc độ !, Bây giờ ứng dụng sẽ hoạt động trên bất kỳ máy nào [tùy thuộc vào hệ điều hành bạn đã biên dịch, nếu không phải tất cả. LOL] không có python hoặc thư viện, nó cũng làm xáo trộn mã của bạn và về mặt kỹ thuật 'sản xuất' đã sẵn sàng [ở một mức độ]. Một số trình biên dịch cũng tạo ra mã C, mà tôi chưa thực sự nhìn vào hoặc thấy nếu nó hữu ích hay chỉ là vô nghĩa. Chúc may mắn. I'd like to make another quick note about compiling: when you compile, the resulting binary is much bigger than your python script as it builds all dependencies into it, etc. But then you get a few distinct benefits: speed!, now the app will work on any machine [depending on which OS you compiled for, if not all. lol] without Python or libraries, it also obfuscates your code and is technically 'production' ready [to a degree]. Some compilers also generate C code, which I haven't really looked at or seen if it's useful or just gibberish. Good luck.
Hy vọng điều đó sẽ giúp.
+01: from libc.math cimport sqrt
__pyx_t_1 = PyDict_New[]; if [unlikely[!__pyx_t_1]] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF[__pyx_t_1]; if [PyDict_SetItem[__pyx_d, __pyx_n_s_test, __pyx_t_1] < 0] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF[__pyx_t_1]; __pyx_t_1 = 0;
+02: import numpy as np
__pyx_t_1 = __Pyx_Import[__pyx_n_s_numpy, 0, -1]; if [unlikely[!__pyx_t_1]] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF[__pyx_t_1]; if [PyDict_SetItem[__pyx_d, __pyx_n_s_np, __pyx_t_1] < 0] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF[__pyx_t_1]; __pyx_t_1 = 0;
03: cimport numpy as np
04: cimport cython
05:
06: # function pointer
+07: ctypedef double [*func][double[:, ::1], int i, int j]
typedef double [*__pyx_t_46_cython_magic_b37b7c839d5aa08ad1e5a2ad53e9c211_func][__Pyx_memviewslice, int, int];
__pyx_t_1 = PyDict_New[]; if [unlikely[!__pyx_t_1]] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF[__pyx_t_1]; if [PyDict_SetItem[__pyx_d, __pyx_n_s_test, __pyx_t_1] < 0] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF[__pyx_t_1]; __pyx_t_1 = 0;0
__pyx_t_1 = PyDict_New[]; if [unlikely[!__pyx_t_1]] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF[__pyx_t_1]; if [PyDict_SetItem[__pyx_d, __pyx_n_s_test, __pyx_t_1] < 0] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF[__pyx_t_1]; __pyx_t_1 = 0;1
__pyx_t_1 = PyDict_New[]; if [unlikely[!__pyx_t_1]] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF[__pyx_t_1]; if [PyDict_SetItem[__pyx_d, __pyx_n_s_test, __pyx_t_1] < 0] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF[__pyx_t_1]; __pyx_t_1 = 0;2
__pyx_t_1 = PyDict_New[]; if [unlikely[!__pyx_t_1]] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF[__pyx_t_1]; if [PyDict_SetItem[__pyx_d, __pyx_n_s_test, __pyx_t_1] < 0] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF[__pyx_t_1]; __pyx_t_1 = 0;3
__pyx_t_1 = PyDict_New[]; if [unlikely[!__pyx_t_1]] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF[__pyx_t_1]; if [PyDict_SetItem[__pyx_d, __pyx_n_s_test, __pyx_t_1] < 0] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF[__pyx_t_1]; __pyx_t_1 = 0;4
__pyx_t_1 = PyDict_New[]; if [unlikely[!__pyx_t_1]] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF[__pyx_t_1]; if [PyDict_SetItem[__pyx_d, __pyx_n_s_test, __pyx_t_1] < 0] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF[__pyx_t_1]; __pyx_t_1 = 0;5
__pyx_t_1 = PyDict_New[]; if [unlikely[!__pyx_t_1]] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF[__pyx_t_1]; if [PyDict_SetItem[__pyx_d, __pyx_n_s_test, __pyx_t_1] < 0] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF[__pyx_t_1]; __pyx_t_1 = 0;6
__pyx_t_1 = PyDict_New[]; if [unlikely[!__pyx_t_1]] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF[__pyx_t_1]; if [PyDict_SetItem[__pyx_d, __pyx_n_s_test, __pyx_t_1] < 0] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF[__pyx_t_1]; __pyx_t_1 = 0;7
__pyx_t_1 = PyDict_New[]; if [unlikely[!__pyx_t_1]] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF[__pyx_t_1]; if [PyDict_SetItem[__pyx_d, __pyx_n_s_test, __pyx_t_1] < 0] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF[__pyx_t_1]; __pyx_t_1 = 0;8
__pyx_t_1 = PyDict_New[]; if [unlikely[!__pyx_t_1]] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF[__pyx_t_1]; if [PyDict_SetItem[__pyx_d, __pyx_n_s_test, __pyx_t_1] < 0] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF[__pyx_t_1]; __pyx_t_1 = 0;9
+02: import numpy as np0
+02: import numpy as np1
+02: import numpy as np2
+02: import numpy as np3
+02: import numpy as np4
+02: import numpy as np5
+02: import numpy as np6
+02: import numpy as np7
+02: import numpy as np8
+02: import numpy as np9
__pyx_t_1 = __Pyx_Import[__pyx_n_s_numpy, 0, -1]; if [unlikely[!__pyx_t_1]] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF[__pyx_t_1]; if [PyDict_SetItem[__pyx_d, __pyx_n_s_np, __pyx_t_1] < 0] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF[__pyx_t_1]; __pyx_t_1 = 0;0
__pyx_t_1 = __Pyx_Import[__pyx_n_s_numpy, 0, -1]; if [unlikely[!__pyx_t_1]] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF[__pyx_t_1]; if [PyDict_SetItem[__pyx_d, __pyx_n_s_np, __pyx_t_1] < 0] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF[__pyx_t_1]; __pyx_t_1 = 0;1
__pyx_t_1 = __Pyx_Import[__pyx_n_s_numpy, 0, -1]; if [unlikely[!__pyx_t_1]] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF[__pyx_t_1]; if [PyDict_SetItem[__pyx_d, __pyx_n_s_np, __pyx_t_1] < 0] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF[__pyx_t_1]; __pyx_t_1 = 0;2
__pyx_t_1 = __Pyx_Import[__pyx_n_s_numpy, 0, -1]; if [unlikely[!__pyx_t_1]] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF[__pyx_t_1]; if [PyDict_SetItem[__pyx_d, __pyx_n_s_np, __pyx_t_1] < 0] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF[__pyx_t_1]; __pyx_t_1 = 0;3
__pyx_t_1 = __Pyx_Import[__pyx_n_s_numpy, 0, -1]; if [unlikely[!__pyx_t_1]] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF[__pyx_t_1]; if [PyDict_SetItem[__pyx_d, __pyx_n_s_np, __pyx_t_1] < 0] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF[__pyx_t_1]; __pyx_t_1 = 0;4
__pyx_t_1 = __Pyx_Import[__pyx_n_s_numpy, 0, -1]; if [unlikely[!__pyx_t_1]] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF[__pyx_t_1]; if [PyDict_SetItem[__pyx_d, __pyx_n_s_np, __pyx_t_1] < 0] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF[__pyx_t_1]; __pyx_t_1 = 0;5
__pyx_t_1 = __Pyx_Import[__pyx_n_s_numpy, 0, -1]; if [unlikely[!__pyx_t_1]] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF[__pyx_t_1]; if [PyDict_SetItem[__pyx_d, __pyx_n_s_np, __pyx_t_1] < 0] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF[__pyx_t_1]; __pyx_t_1 = 0;6
__pyx_t_1 = __Pyx_Import[__pyx_n_s_numpy, 0, -1]; if [unlikely[!__pyx_t_1]] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF[__pyx_t_1]; if [PyDict_SetItem[__pyx_d, __pyx_n_s_np, __pyx_t_1] < 0] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF[__pyx_t_1]; __pyx_t_1 = 0;7
__pyx_t_1 = __Pyx_Import[__pyx_n_s_numpy, 0, -1]; if [unlikely[!__pyx_t_1]] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF[__pyx_t_1]; if [PyDict_SetItem[__pyx_d, __pyx_n_s_np, __pyx_t_1] < 0] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF[__pyx_t_1]; __pyx_t_1 = 0;8
__pyx_t_1 = __Pyx_Import[__pyx_n_s_numpy, 0, -1]; if [unlikely[!__pyx_t_1]] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF[__pyx_t_1]; if [PyDict_SetItem[__pyx_d, __pyx_n_s_np, __pyx_t_1] < 0] {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF[__pyx_t_1]; __pyx_t_1 = 0;9
03: cimport numpy as np0
03: cimport numpy as np1
03: cimport numpy as np2
03: cimport numpy as np3
03: cimport numpy as np4
03: cimport numpy as np5
03: cimport numpy as np6
03: cimport numpy as np7
03: cimport numpy as np8
03: cimport numpy as np9
04: cimport cython0
04: cimport cython1
04: cimport cython2
04: cimport cython3
04: cimport cython4
04: cimport cython5
04: cimport cython6
04: cimport cython7
04: cimport cython8
04: cimport cython9
05:0
05:1
05:2
05:3
05:4
05:5