2009-07-07 40 views
5

Tôi đã chơi với pyglet. Nó rất đẹp. Tuy nhiên, nếu tôi chạy mã của tôi, mà là trong một tập tin thực thi (gọi nó là game.py) bắt đầu bằng thông thườngKiểm soát lập trình tối ưu hóa python?

#!/usr/bin/env python 

bằng cách làm

./game.py 

thì đó là một chút thời gian. Nhưng nếu tôi chạy nó với

python -O ./game.py 

hoặc

PYTHONOPTIMIZE=1 ./game.py 

sau đó nó siêu mịn.

Tôi không quan tâm nhiều vì sao nó chạy chậm mà không tối ưu hóa; tài liệu của pyglet đề cập đến việc tối ưu hóa vô hiệu hóa nhiều xác nhận và cũng kiểm tra lỗi của OpenGL, và tôi rất vui khi để nó ở đó.

Câu hỏi của tôi là: cách mọi người phân phối mã Python đảm bảo người dùng cuối (không quan tâm đến việc gỡ lỗi hoặc sửa đổi mã) chạy phiên bản được tối ưu hóa của mã. Chắc chắn có một số cách tốt hơn chỉ cần nói với mọi người để đảm bảo rằng họ sử dụng tối ưu hóa trong các ghi chú phát hành (mà họ có lẽ sẽ không đọc anyway)?

Trên Linux tôi có thể dễ dàng cung cấp một kịch bản ./game để chạy các tập tin cho người dùng cuối:

#!/bin/sh 
PYTHONOPTIMIZE=1 ./game.py $* 

nhưng đó không phải là rất cross-platform.

Tôi có một ý tưởng tôi nên để có thể có sự thay đổi #! để

#!/usr/bin/env PYTHONOPTIMIZE=1 python 

hoặc

#!/usr/bin/env python -O 

nhưng những người dường như không làm việc như mong đợi, và tôi không chắc chắn họ sẽ làm gì trên Windows.

Có cách nào để kiểm soát tối ưu hóa từ bên trong mã mà tôi không biết? Cái gì như:

import runtime 
    runtime.optimize(True) 

gì được coi là thực hành tốt nhất trong lĩnh vực này bởi những người vận chuyển mã python đa nền tảng?

+2

Đây không phải là câu trả lời vì câu trả lời S.Lotts hoàn toàn chính xác và đầy đủ. Đi với game.sh và game.bat, nó hoạt động. Nhưng chỉ cần một bình luận: #! dòng hoàn toàn không có gì trên Windows, nó hoàn toàn bị bỏ qua. –

Trả lời

14

"Trên Linux tôi có thể dễ dàng cung cấp một kịch bản ./game để chạy các tập tin cho người dùng cuối:"

đúng.

"nhưng đó không phải là rất đa nền tảng."

Half-correct. Có chính xác hai ngôn ngữ shell quan trọng. Tiêu chuẩn Linux "sh" và Windows không chuẩn "bat" (a/k/a cmd.exe) và đó là tất cả những gì hiện nay. [Khi tôi còn là một đứa trẻ, đã có Open VMS DCL và ngôn ngữ shell lạ của Data General và RSX-11 và tất cả những thứ tuyệt vời. Cảm ơn Chúa vì tiêu chuẩn Posix.]

trò chơi.sh

python -O game.py 

game.bat

python -O game.py 

Điều thú vị là các tập tin đều giống nhau, chỉ có phần mở rộng (và các định dạng tập tin) đã được thay đổi để làm cho hệ điều hành khác nhau của hạnh phúc.

Nếu bạn muốn đúng một nền tảng đa kích thước phù hợp, bạn phải nhớ rằng Python là ngôn ngữ trình bao. Loại điều này cũng hoạt động.

game-startup.py

import subprocess 
subprocess.Popen("python -O game.py") 
+0

Cảm ơn! Tôi thích nó khi một vấn đề có một giải pháp đơn giản tốt đẹp. – timday

2

Trả lời câu hỏi của bạn (như trái ngược để sửa chữa vấn đề của bạn, mà S. Lott đã làm một cách hoàn hảo), tôi nghĩ rất nhiều thời gian với những người phân phối mã Python không lo lắng về điều này, bởi vì hiếm khi cờ tối ưu hóa có hiệu lực. Tôi tin Pyglet là ngoại lệ duy nhất mà tôi từng nghe trong nhiều năm sử dụng Python. Trích dẫn từ Python docs, "Trình tối ưu hóa hiện không giúp được gì nhiều, nó chỉ loại bỏ các câu khẳng định".

+0

Tương tự như vậy: đây là lần đầu tiên tôi thấy cờ tối ưu hóa tạo ra bất kỳ sự khác biệt đáng chú ý nào cho bất kỳ mã python nào. Mã khiến tôi nâng cao câu hỏi sử dụng một số lượng lớn các cuộc gọi GL "chế độ tức thời"; Tôi nghi ngờ (chưa kiểm tra) pyglet thực hiện các xác nhận khác nhau (có thể bao gồm một glGetError) cho mỗi một đơn và tất cả đều tăng lên. – timday

+3

Nhưng -OO loại bỏ tất cả các tài liệu, điều này có thể dẫn đến những bất ngờ. Matplotlib sử dụng các tài liệu được lập trình được xây dựng theo chương trình, ví dụ: % s escape trong docstring được thay thế bằng f .__ doc__ = f .__ doc__% kwdict, gây ra lỗi khi chạy với -OO. –