2012-01-04 29 views
6

मुझे कोड अनुकूलन के लिए समय-सारिणी फ़ंक्शन के साथ कोई समस्या है। उदाहरण के लिए, मैं एक फ़ाइल में मानकों के साथ काम करता है लेखन, इसे myfunctions.py युक्त कॉल:पायथन टाइमिट और "वैश्विक नाम ... परिभाषित नहीं किया गया है"

def func1(X): 
    Y = X+1 
    return Y 

और मैं एक दूसरे फ़ाइल test.py जहाँ मैं (कोड प्रदर्शन का परीक्षण करने के स्पष्ट रूप से और अधिक जटिल में टाइमर समारोह फोन में इस समारोह का परीक्षण समस्याओं) युक्त:

import myfunctions 
X0 = 1 
t = Timer("Y0 = myfunctions.func1(X0)") 
print Y0 
print t.timeit() 

Y0 गणना नहीं है, और यहां तक ​​कि अगर मैं टिप्पणी print Y0 लाइन त्रुटि global name 'myfunctions' is not defined हुई।

अगर मैं आदेश

t = Timer("Y0 = myfunctions.func1(X0)","import myfunctions") 

अब त्रुटि global name 'X0' is not defined हुआ के साथ सेटअप निर्दिष्ट करें।

क्या कोई इसे हल करने के बारे में जानता है? बहुत धन्यवाद।

+0

[वैश्विक नाम 'foo' प्राप्त करने का संभावित डुप्लिकेट "पायथन के समय के साथ परिभाषित नहीं किया गया है] (https://stackoverflow.com/questions/551797/getting-global-name-foo-is-not-defined-with -पिथन्स-टाइमिट) – sds

उत्तर

6

आपको setup पैरामीटर की आवश्यकता है। प्रयास करें:

Timer("Y0 = myfunctions.func1(X0)", setup="import myfunctions; X0 = 1") 
+0

जैसा कि मैंने इस प्रश्न में उल्लेख किया है, यह एक त्रुटि लौटाता है "वैश्विक नाम 'एक्स 0' परिभाषित नहीं किया गया है" – cedm34

+0

@ cedm34 अद्यतन –

+1

देखें वैश्विक त्रुटि अच्छी तरह से निराश है।लेकिन यह वाई 0 मान नहीं बना है। क्या कोई समाधान है? – cedm34

4

Y0 के लिए कारण अपरिभाषित की जा रही है कि आप को परिभाषित किया है कि एक स्ट्रिंग में है, लेकिन निष्पादन की शुरुआत में पार्स समय में स्ट्रिंग अभी तक मूल्यांकन नहीं है जीवन में चर लाने के लिए। तो अपनी स्क्रिप्ट के शीर्ष पर कहीं भी Y0 = 0 डालें ताकि इसे पहले से परिभाषित किया जा सके।

सभी बाहरी कार्यों और चर को setup तर्क का उपयोग करके दिया जाना चाहिए। तो आपको सेटअप पैरामीटर के रूप में "import myfunctions; X0 = 1" की आवश्यकता है।

यह काम करेगा:

from timeit import Timer 
import myfunctions 
X0 = 1 
Y0 = 0  #Have Y0 defined 
t = Timer("Y0 = myfunctions.func1(X0)", "import myfunctions; X0 = %i" % (X0,)) 
print t.timeit() 
print Y0 

देखो कि कैसे मैं "X0 = %i" % (X0,) इस्तेमाल किया बाहरी X 0 चर के वास्तविक मूल्य में पारित करने के लिए।

एक और बात आप जानना चाहते हो सकता है कि यदि आपके मुख्य फ़ाइल में किसी भी कार्य करता है कि आप timeit में उपयोग करना चाहते हैं, तो आप timeitfrom __main__ import * दूसरा तर्क के रूप में पास करके उन्हें पहचान कर सकते हैं।


आप timeit चाहते हैं अपने चर को संशोधित करने में सक्षम हो, तो आप तार उन्हें पारित नहीं करना चाहिए। अधिक सुविधाजनक आप इसे कॉलबेल पास कर सकते हैं। आपको एक कॉल करने योग्य पास करना चाहिए जो आपके वांछित चर को बदलता है। आपको setup की आवश्यकता नहीं है। देखो:

from timeit import Timer 
import myfunctions 

def measure_me(): 
    global Y0 #Make measure_me able to modify Y0 
    Y0 = myfunctions.func1(X0) 

X0 = 1 
Y0 = 0  #Have Y0 defined 
t = Timer(measure_me) 
print t.timeit() 
print Y0 

जैसा कि आप देख, मैं print Y0print t.timeit() के बाद से पहले निष्पादन के बाद से आप की है अपने मूल्य को बदला नहीं जा सकता है डाला!

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

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