2009-07-07 17 views
5

मैं pyglet के साथ खेल रहा हूं। यह बहुत अच्छा है। हालांकि, अगर मैं अपने कोड है, जो एक निष्पादन योग्य फ़ाइल में है चलाने (यह game.py फोन)पायथन अनुकूलन का प्रोग्रामेटिक नियंत्रण?

./game.py 

करके सामान्य

#!/usr/bin/env python 

लगी होती तो यह थोड़ा भद्दा है। लेकिन अगर मैं यह

python -O ./game.py 

या

PYTHONOPTIMIZE=1 ./game.py 

तो इसकी सुपर चिकनी के साथ चलाते हैं।

मुझे बहुत परवाह नहीं है कि यह ऑप्टिमाइज़ेशन के बिना धीमा क्यों चलता है; पायगलेट के दस्तावेज में उल्लेख किया गया है कि अनुकूलन कई आवेषणों को अक्षम करता है और ओपनजीएल की त्रुटि जांच भी अक्षम करता है, और मुझे इसे छोड़ने में खुशी होती है।

मेरा प्रश्न है: लोग पाइथन कोड वितरित करने के तरीके को सुनिश्चित करते हैं कि अंतिम उपयोगकर्ता (कोड को डिबगिंग या संशोधित करने में शून्य रुचि के साथ) कोड के अनुकूलित संस्करण को चलाते हैं। निश्चित रूप से लोगों को यह सुनिश्चित करने के लिए कुछ बेहतर तरीका है कि वे रिलीज नोट्स में ऑप्टिमाइज़ेशन का उपयोग करें (जिसे वे शायद वैसे भी पढ़ नहीं पाएंगे)?

लिनक्स पर मैं आसानी से अंत उपयोगकर्ताओं के लिए फ़ाइल को चलाने के एक ./game स्क्रिप्ट प्रदान कर सकते हैं:

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

लेकिन है कि बहुत पार मंच नहीं है।

मैं मैं

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

या

#!/usr/bin/env python -O 

लेकिन उन लोगों के लिए #! लाइन बदलने के लिए अपेक्षा के अनुरूप काम नहीं हैं सक्षम होना चाहिए एक विचार है, और मुझे नहीं कर रहा हूँ सुनिश्चित करें कि वे विंडोज पर क्या करेंगे।

क्या कोड के भीतर से ऑप्टिमाइज़ेशन को नियंत्रित करने का कोई तरीका है जिसे मैं अनजान हूं? कुछ की तरह:

import runtime 
    runtime.optimize(True) 

क्या शिपिंग बहु मंच अजगर कोड लोगों द्वारा इस क्षेत्र में सबसे अच्छा अभ्यास माना जाता है?

+2

यह कोई जवाब नहीं है, क्योंकि एसएलओटीएस जवाब पूरी तरह से सही और संपूर्ण था। Game.sh और game.bat के साथ जाएं, यह काम करता है। लेकिन सिर्फ एक टिप्पणी: #! लाइन विंडोज पर बिल्कुल कुछ भी नहीं करती है, इसे पूरी तरह नजरअंदाज कर दिया जाता है। –

उत्तर

14

"लिनक्स पर मैं आसानी से अंत उपयोगकर्ताओं के लिए फ़ाइल को चलाने के एक ./game स्क्रिप्ट प्रदान कर सकते हैं:"

सही।

"लेकिन यह बहुत क्रॉस-प्लेटफार्म नहीं है।"

आधा सही। कोई फर्क नहीं पड़ता कि वास्तव में दो खोल भाषाएं हैं। मानक लिनक्स "sh" और गैर मानक विंडोज "बल्ले" (ए/के/एक cmd.exe) और यह सब आजकल है। [जब मैं एक बच्चा था, वहां ओपन वीएमएस डीसीएल और डेटा जनरल की अजीब शैल भाषा और आरएसएक्स -11 और सभी प्रकार की महान चीजें थीं। Posix मानक के लिए भगवान का शुक्र है।]

खेल।श

python -O game.py 

game.bat

python -O game.py 

दिलचस्प बात यह है फ़ाइलें एक ही है, केवल विस्तार (और फ़ाइल स्वरूप) विभिन्न ओएस खुश करने के लिए परिवर्तित किया जा सकता था कर रहे हैं।

यदि आप सच एक आकार-फिट-सभी क्रॉस प्लेटफ़ॉर्म चाहते हैं, तो आपको याद रखना होगा कि पायथन एक शैल भाषा है। इस तरह की चीज भी काम करती है।

game-startup.py

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

धन्यवाद! मुझे यह पसंद है जब किसी समस्या का एक अच्छा सरल समाधान होता है। – timday

2

अपने प्रश्न का उत्तर देना (आपकी समस्या है, जो एस लोट पूरी तरह से किया था तय करने के लिए विरोध करने के रूप में), मुझे लगता है कि बहुत समय लोग हैं, जो अजगर कोड वितरित न इसके बारे में चिंता करें, क्योंकि अनुकूलन ध्वज के लिए यह दुर्लभ है। मेरा मानना ​​है कि पायगलेट एकमात्र अपवाद है जिसे मैंने पाइथन का उपयोग करने के वर्षों में सुना है। Python docs, से उद्धरण "वर्तमान में अनुकूलक बहुत मदद नहीं करता है, यह केवल जोरदार बयान हटा देता है"।

+0

इसी प्रकार: यह पहली बार है जब मैंने ऑप्टिमाइज़ ध्वज को किसी भी पायथन कोड पर कोई ध्यान देने योग्य अंतर देखा है। कोड जिसने मुझे प्रश्न उठाने के लिए प्रेरित किया, बड़ी संख्या में "तात्कालिक मोड" जीएल कॉल का उपयोग करता है; मुझे संदेह है (चेक नहीं किया गया है) पिगलेट प्रत्येक एक के लिए विभिन्न asserts (शायद एक glgetError सहित) करता है और यह सब जोड़ता है। – timday

+3

लेकिन -OO सभी डॉकस्ट्रिंग को हटा देता है, जो आश्चर्य की ओर ले सकता है। Matplotlib प्रोग्रामेटिक रूप से निर्मित डॉकस्ट्रिंग का उपयोग करता है, उदा। % s docstring में भाग जाता है जिसे f .__ doc__ = f .__ doc__% kwdict के साथ प्रतिस्थापित किया जाता है, जो -OO के साथ चलते समय त्रुटि उत्पन्न करता है। –

संबंधित मुद्दे