Chuyển đổi chương trình Python sang mã C / C ++? [đóng cửa]


149

có thể chuyển đổi chương trình Python sang C / C ++ không?

Tôi cần triển khai một vài thuật toán và tôi không chắc khoảng cách hiệu suất có đủ lớn để biện minh cho tất cả những nỗi đau tôi phải trải qua khi thực hiện nó trong C / C ++ (mà tôi không giỏi). Tôi nghĩ về việc viết một thuật toán đơn giản và đánh giá nó dựa trên một giải pháp được chuyển đổi như vậy. Nếu bản thân nó nhanh hơn đáng kể so với phiên bản Python, thì tôi không có lựa chọn nào khác ngoài việc làm nó trong C / C ++.


32
Nhiều như Python mất điểm chuẩn, hãy nhớ rằng việc giảm tốc độ 50x hoặc 100x vẫn có thể bị phủ định nếu phép tính kết thúc sau vài giây trong Python và thậm chí không đúng khi bạn thực hiện nhiều I / O hoặc có thuật toán khủng khiếp. Thay vì hỏi "Python chậm hơn bao nhiêu?" bạn nên hỏi "Python có đủ nhanh không?" (và nó có khả năng nhất là, trung thực) - điều đó cũng nhanh hơn so với điểm chuẩn hoặc hỏi ở đây.

1
Việc thực hiện một thuật toán trong python khá nhanh và đơn giản ... bạn chỉ cần thực hiện nó và sau đó kiểm tra xem nó có đủ nhanh không. Hầu hết thời gian bạn có thể tối ưu hóa thuật toán để chạy nhanh hơn nhiều bằng cách sử dụng các cấu trúc dữ liệu khác nhau (dict / sets thay vì danh sách ...) hoặc các hoạt động khác nhau. Dù sao, tối ưu hóa sẽ xảy ra sau khi bạn đã thực hiện một bản thảo đầu tiên của thuật toán và điểm chuẩn / định hình nó.
Bakuriu

@delnan: trong trường hợp của tôi, đó là tất cả về thời gian tính toán. Nếu biến thể C cần ít giờ hơn x, thì tôi sẽ đầu tư thời gian đó để cho các thuật toán chạy lâu hơn / một lần nữa. Tôi chỉ đơn giản muốn tìm hiểu (đại khái) Python sẽ chậm hơn bao nhiêu - nếu chỉ một vài giờ tôi chắc chắn sẽ không sử dụng ngôn ngữ mà tôi không thoải mái (bạn có thể phá hỏng các giải pháp tốt nhất cho các vấn đề với việc triển khai xấu: P).
CrazyFellingCloseline

@ delnan đúng về Python có thể đủ nhanh cho nhiều thứ. Ngay cả khi nó chậm hơn, sự dễ dàng của sự phát triển, bảo trì và tăng cường trong tương lai là những yếu tố quan trọng cần xem xét.
martineau

"X giờ"? Cái này to cỡ nào Bạn đã điểm chuẩn một triển khai? Bạn có số đo? Bạn đã lập hồ sơ thực hiện? Hay bạn đang cố gắng tối ưu hóa sớm giải pháp?
S.Lott

Câu trả lời:


115

Đúng. Hãy nhìn Cython . Nó thực hiện điều đó: Chuyển đổi Python thành C để tăng tốc.


6
Tất nhiên điều đó sẽ không tiết kiệm cho bạn bất cứ điều gì trừ khi bạn thêm một loạt các cdefkhai báo và do đó giới thiệu kiểu gõ tĩnh (nếu không, bạn chỉ cần xử lý các PyObject *công cụ mờ đục ). Và nó sẽ không bao giờ nhanh như C thông thường vì nó thường giao tiếp với Python (100% trở lên? Chỉ đối với mã số đơn giản không giao tiếp với Python trong hầu hết thời gian!). Nhưng khác với điều đó, vâng, nó có thể giúp bạn tăng tốc khá nhanh.

7
@delnan: Trong thực tế, nó giúp bạn tiết kiệm một cái gì đó. Hầu hết mã Python thuần túy sẽ nhanh hơn sau khi được biên dịch. Nhưng vâng, với các cdefs và gõ tĩnh, bạn thực sự bắt đầu thấy sự khác biệt. Và giao diện với Python bạn nhận được trong mọi trường hợp bạn sử dụng C từ Python.
Lennart Regebro

136

Nếu biến thể C cần ít giờ hơn x, thì tôi sẽ đầu tư thời gian đó để cho các thuật toán chạy lâu hơn / một lần nữa

"Đầu tư" không phải là từ đúng ở đây.

  1. Xây dựng một triển khai làm việc trong Python. Bạn sẽ hoàn thành việc này rất lâu trước khi bạn hoàn thành phiên bản C.

  2. Đo hiệu suất với trình hồ sơ Python. Khắc phục mọi sự cố bạn tìm thấy. Thay đổi cấu trúc dữ liệu và thuật toán khi cần thiết để thực sự làm điều này đúng cách. Bạn sẽ hoàn thành việc này rất lâu trước khi bạn hoàn thành phiên bản đầu tiên trong C.

  3. Nếu vẫn còn quá chậm, hãy dịch thủ công Python được thiết kế tốt và được xây dựng cẩn thận sang C.

    Do cách thức hoạt động của tầm nhìn xa, thực hiện phiên bản thứ hai từ Python hiện có (với các bài kiểm tra đơn vị hiện có và với dữ liệu lược tả hiện tại) sẽ vẫn nhanh hơn so với việc thử làm mã C từ đầu.

Câu nói này rất quan trọng.

Quy tắc của Thompson dành cho các nhà sản xuất kính viễn vọng lần đầu
chế tạo một chiếc gương bốn inch và sau đó là một chiếc gương sáu inch sẽ nhanh hơn so với làm một chiếc gương sáu inch.


Viện Bill McKeenan Wang


15
Bất kể điểm số rất lớn, tôi không thấy cách này trả lời câu hỏi.
Audrius Meskauskas

29

Shed Skin là "trình biên dịch Python-to-C ++" (bị hạn chế).


3
+1 một ưu điểm của Shed Skin là suy luận kiểu : nếu có thể đoán các loại biến từ luồng chương trình, việc kiểm tra kiểu động sẽ tránh được. Điều này thường dẫn đến mã C ++ ngắn hơn mà thực tế có thể đọc và biên dịch thành các chương trình nhanh hơn.
Kyss Tao

1
Ngoài ra còn có trình biên dịch Python → 11l → C ++ , cũng là trình biên dịch Python bị hạn chế đối với C ++, nhưng nó hỗ trợ một số tính năng của Python, không được hỗ trợ với Shed Skin (ví dụ: các hàm / đóng cửa lồng nhau).
tav

17

Chỉ cần đi qua đây công cụ mới trong tin tức hacker.

Từ trang của họ - "Nuitka là sự thay thế tốt cho trình thông dịch Python và biên dịch mọi cấu trúc mà CPython 2.6, 2.7, 3.2 và 3.3 cung cấp. Nó dịch Python thành chương trình C ++ sau đó sử dụng" libpython "để thực thi theo cách tương tự như CPython, theo cách rất tương thích. "


Dự án này trưởng thành hơn rất nhiều so với các lựa chọn tương tự khác. Thật buồn cười khi nó tạo ra nhị phân với một .exephần mở rộng trên OSX mặc dù nó là một tệp thực thi OSX Mach-O hoàn toàn bình thường. Trông giống như nó có thể là một sự thay thế tốt cho pyinstaller, py2exe, py2app, vv --recurse-***cờ rất quan trọng để thiết lập đúng mặc dù.
ccpizza

Nuitka là tuyệt vời, nhưng mã C / C ++ được tạo ra đang sử dụng PyObject liên kết với việc thực thi mã CPython-C. Nó không tạo ra mã C thành ngữ.
Make42

8

Một tùy chọn khác - để chuyển đổi sang C ++ bên cạnh Shed Skin - là Pythran .

Để trích dẫn Python hiệu suất cao của Micha Gorelick và Ian Ozsvald :

Pythran là trình biên dịch Python-to-C ++ cho một tập hợp con Python bao gồm numpyhỗ trợ một phần . Nó hoạt động giống như Numba và Cython, bạn chú thích các đối số của hàm, và sau đó nó tiếp tục với chú thích kiểu và chuyên môn mã hơn nữa. Nó tận dụng các khả năng vector hóa và các khả năng song song hóa dựa trên OpenMP. Nó chỉ chạy bằng Python 2.7.

Một tính năng rất thú vị của Pythran là nó sẽ cố gắng tự động phát hiện các cơ hội song song (ví dụ: nếu bạn đang sử dụng a map) và biến mã này thành mã song song mà không cần thêm nỗ lực từ bạn. Bạn cũng có thể chỉ định các phần song song bằng cách sử dụng pragma omp > chỉ thị; về mặt này, nó cảm thấy rất giống với hỗ trợ OpenMP của Cython.

Đằng sau hậu trường, Pythran sẽ lấy cả mã Python và mã thông thường và cố gắng biên dịch mạnh mẽ chúng thành C ++ rất nhanh - thậm chí còn nhanh hơn cả kết quả của Cython.

Bạn nên lưu ý rằng dự án này còn trẻ và bạn có thể gặp lỗi; bạn cũng nên lưu ý rằng nhóm phát triển rất thân thiện và có xu hướng sửa lỗi trong vài giờ.


6

Tôi biết đây là một chủ đề cũ hơn nhưng tôi muốn đưa ra những gì tôi nghĩ là thông tin hữu ích.

Cá nhân tôi sử dụng PyPy rất dễ cài đặt bằng pip. Tôi có thể hoán đổi cho nhau sử dụng trình thông 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 (Hoặc là Python 2x hoặc 3x). Tôi sử dụng pyCharm Community Edition để quản lý mã của mình và tôi thích nó.

Tôi thích viết mã bằng python vì tôi nghĩ nó cho phép bạn tập trung vào nhiệm vụ hơn ngôn ngữ, đó là một điểm cộng rất lớn đối với tôi. Và nếu bạn cần nó nhanh hơn nữa, bạn luôn có thể biên dịch thành tệp nhị phân cho Windows, Linux hoặc Mac (không đơn giản nhưng có thể với các công cụ khác). Từ kinh nghiệm của mình, tôi nhận được khoảng 3,5 lần tăng tốc so với PyPy khi biên dịch, 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 IDE như PyCharm, bạn có thể trao đổi giữa PyPy, Cython và Python rất dễ dàng (mặc dù chỉ cần một chút học tập 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.

Chỉnh sửa: Tôi muốn thực hiện một ghi chú nhanh khác về biên dịch: khi bạn biên dịch, tệp 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 nó, 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 mà 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à sẵn sàng về mặt kỹ thuật (sản xuất '(ở mức độ). Một số trình biên dịch cũng tạo mã C, mà tôi chưa thực sự nhìn hoặc thấy nếu nó hữu ích hay chỉ là vô nghĩa. Chúc may mắn.

Mong rằng sẽ giúp.


2
Tôi biết đây là một bình luận cũ hơn, nhưng cảm ơn!
kfrncs

Không có vấn đề, tôi rất vui vì nó hữu ích.
jacktrader

Bạn sử dụng phần mềm nào để biên dịch từ phiên dịch PyPy?
Vasyl Vaskivskyi

Không cụ thể là PyPy, chỉ là các kịch bản .py. Nuitka nếu bạn muốn "mã nguồn C / C ++, hoặc mã nguồn C / C ++" và PyInstaller nếu bạn chỉ muốn một tệp thực thi (dễ dàng hơn). Cũng có py2exe nhưng tôi đã ít thành công hơn với nó, mặc dù tôi chắc chắn mọi thứ đã được cải thiện. PyInstaller cũng là nền tảng chéo, không chỉ dành cho Windows thực thi (hoạt động với Linux và Mac). Nuitka là duy nhất bởi vì tôi nghĩ đó là "trình biên dịch" duy nhất cung cấp cho bạn mã nguồn có thể sử dụng trở lại mà theo lý thuyết bạn có thể tối ưu hóa hơn nữa. Có một vài thứ khác như bbFreeze, cx_Freeze và py2app nhưng tôi chưa thử chúng. May mắn nhất!
jacktrader

1
Tôi cũng đã tìm thấy PyPy để chạy nhanh hơn Cython. Trong một thử nghiệm, tôi thực sự thấy PyPy có cùng tốc độ với phiên bản C ++ của chương trình (sắp xếp chèn).
Nv7

5

Tôi nhận ra rằng một câu trả lời về một giải pháp khá mới là thiếu. Nếu Numpy được sử dụng trong mã, tôi khuyên bạn nên dùng thử Pythran:

http://pythran.readthedocs.io/

Đối với các chức năng tôi đã thử, Pythran cho kết quả cực kỳ tốt. Các hàm kết quả là mã Fortran được viết nhanh (hoặc chỉ chậm hơn một chút) và nhanh hơn một chút so với giải pháp Cython (khá tối ưu hóa).

Ưu điểm so với Cython là bạn chỉ cần sử dụng Pythran trên hàm Python được tối ưu hóa cho Numpy, nghĩa là bạn không phải mở rộng các vòng lặp và thêm các loại cho tất cả các biến trong vòng lặp. Pythran dành thời gian để phân tích mã để nó hiểu các hoạt động trên numpy.ndarray.

Đó cũng là một lợi thế rất lớn so với Numba hoặc các dự án khác dựa trên việc biên dịch đúng lúc mà theo hiểu biết của tôi, bạn phải mở rộng các vòng lặp để thực sự hiệu quả. Và sau đó, mã với các vòng lặp trở nên rất kém hiệu quả khi chỉ sử dụng CPython và Numpy ...

Một nhược điểm của Pythran: không có lớp học! Nhưng vì chỉ có các chức năng thực sự cần được tối ưu hóa phải được biên dịch, nên nó không gây khó chịu lắm.

Một điểm khác: Pythran hỗ trợ song song OpenMP (và rất dễ dàng). Nhưng tôi không nghĩ mpi4py được hỗ trợ ...


4

http://code.google.com.vn/p/py2c/ có vẻ như là một khả năng - họ cũng đề cập trên trang web của họ: Cython, Shed leather và RPython và xác nhận rằng họ đang chuyển đổi mã Python sang C / C ++ thuần túy nhanh hơn C / C ++ đánh đố với các lệnh gọi API Python. Lưu ý: Tôi chưa thử nhưng tôi sẽ ..


1
Có vẻ như Py2C vẫn là một dự án còn dang dở. Nó đã không được cập nhật trong một vài năm, vì vậy nó có thể không còn tồn tại.
Anderson Green
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.