2008-10-15 30 views
13

Tôi tự hỏi liệu có thể tạo ra một mô-đun thực thi từ một tập lệnh Python hay không. Tôi cần có hiệu suất cao nhất và tính linh hoạt của tập lệnh Python, mà không cần chạy trong môi trường Python. Tôi sẽ sử dụng mã này để tải các mô-đun người dùng theo yêu cầu để tùy chỉnh ứng dụng của tôi.Có thể biên dịch Python nguyên bản (ngoài mã byte pyc) không?

Trả lời

14
  • pyrex rằng biên dịch python như nguồn để các module mở rộng python
  • rpython cho phép bạn biên dịch python với một số hạn chế đối với backends khác nhau như C, LLVM, Net, vv
  • Ngoài ra còn có shed-skin chuyển dịch python thành C++, nhưng tôi không thể nói nếu nó là tốt.
  • PyPy triển khai trình biên dịch JIT cố gắng tối ưu hóa thời gian chạy bằng cách dịch các phần đang chạy trong thời gian chạy sang mã máy, nếu bạn viết cho trình thông dịch PyPy có thể là một đường dẫn khả thi.
  • Cùng một tác giả đang làm việc trên JIT trong PyPy đã viết psyco trước đây tối ưu hóa python trong trình thông dịch CPython.
+0

RUNthon AFAIK không thay thế pyrex; chúng là những nỗ lực riêng biệt, và pyrex vẫn hoạt động tốt (nó sẽ là gợi ý thứ hai của tôi, sau khi viết lại các vấn đề trong C/C++). –

+0

Ngoài ra còn có IronPython (giả sử Windows hoặc Mono), mặc dù nó có vấn đề cho dù bạn muốn có thêm tốc độ. –

+0

Liên kết tới rpython và PyPy bị hỏng. – BandGap

7

Bạn có thể sử dụng một cái gì đó như py2exe để biên dịch tập lệnh python của bạn thành một exe, hoặc Freeze cho một nhị phân linux.

xem: How can I create a directly-executable cross-platform GUI app using Python?

+0

@Howler, py2exe sẽ không phân phối hầu hết những gì OP yêu cầu. Mã này vẫn chạy bên trong thời gian chạy Python (mặc dù đã đổi tên) và sẽ không chạy nhanh hơn bất kỳ tập lệnh nào) @David: Bạn có thể cân nhắc viết lại ứng dụng chính trong C/C++ và mở rộng w/Python. – technomalogical

+0

Hoặc thay vì viết lại ứng dụng chính, chỉ cần tìm các điểm nóng và viết chúng trong C/C++ dưới dạng phần mở rộng Python. –

+0

Thực ra, tôi đang tìm một giải pháp để tiêm mã trong môi trường đang chạy. Nhưng mã này cần phải được thực sự nhanh chóng, do đó, giải thích không phải là một lựa chọn. – David

0

Tôi nghĩ bạn có thể sử dụng jython để biên dịch python sang Java bytecode, và sau đó biên dịch với GCJ.

2

Tôi đã có rất nhiều thành công sử dụng Cython, mà là dựa trên và mở rộng pyrex:

Cython là một ngôn ngữ mà làm mở rộng viết C cho ngôn ngữ Python dễ dàng như Python chính nó. Cython được dựa trên Pyrex nổi tiếng, nhưng hỗ trợ nhiều chức năng và tối ưu hóa cạnh cắt hơn .

Ngôn ngữ Cython rất gần với ngôn ngữ Python, nhưng Cython bổ sung hỗ trợ gọi C chức năng và tuyên bố loại C trên biến và các thuộc tính lớp. Điều này cho phép trình biên dịch tạo ra rất mã C hiệu quả từ mã Cython.

Điều này làm cho Cython là ngôn ngữ lý tưởng để gói cho thư viện C bên ngoài, và cho các mô-đun C nhanh giúp tăng tốc độ thực thi mã Python.

Các vấn đề liên quan