পাইথনের সময়সীমার সাথে "গ্লোবাল নাম 'ফু' পাওয়া সংজ্ঞায়িত নয়"


92

আমি পাইথন স্টেটমেন্টটি কার্যকর করতে কত সময় লাগে তা জানার চেষ্টা করছি, তাই আমি অনলাইনে সন্ধান করেছি এবং দেখতে পেয়েছি যে স্ট্যান্ডার্ড লাইব্রেরি হ'ল টাইমাইট নামক একটি মডিউল সরবরাহ করে যা ঠিক তা করতে পারে:

import timeit

def foo():
    # ... contains code I want to time ...

def dotime():
    t = timeit.Timer("foo()")
    time = t.timeit(1)
    print "took %fs\n" % (time,)

dotime()

তবে এটি একটি ত্রুটি তৈরি করে:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in dotime
  File "/usr/local/lib/python2.6/timeit.py", line 193, in timeit
    timing = self.inner(it, self.timer)
  File "<timeit-src>", line 6, in inner
NameError: global name 'foo' is not defined

আমি এখনও পাইথনে নতুন এবং আমি এর সমস্ত স্কোপিংয়ের সমস্যাগুলি পুরোপুরি বুঝতে পারি না তবে কেন জানি না এই স্নিপেটটি কেন কাজ করে না। কোন চিন্তা?

উত্তর:


93

এই লাইনটি পরিবর্তন করুন:

t = timeit.Timer("foo()")

এটি:

t = timeit.Timer("foo()", "from __main__ import foo")

আপনার দেওয়া লিঙ্কটি একেবারে নীচে দেখুন।

আপনার নির্ধারিত ফাংশনগুলিকে টাইমিট মডিউলটি অ্যাক্সেস দিতে আপনি একটি সেটআপ প্যারামিটারটি পাস করতে পারেন যার মধ্যে একটি আমদানি বিবৃতি রয়েছে:

আমি এটি কেবল আমার মেশিনে পরীক্ষা করেছি এবং এটি পরিবর্তনগুলির সাথে কাজ করেছে।


28
এটি কাজ করে! যাইহোক, এটি একটি দুর্দান্ত বোকা ইন্টারফেস ডিজাইন যদি আমার কাছে স্ট্রিং হিসাবে সময় পেতে ইচ্ছুক কমান্ডটি সরবরাহ করতে হয় এবং এটির কাজ করার জন্য মূল মডিউলটি আমদানি করতে হয়।
কাইল ক্রোনিন

4
পাইথন নেমস্পেসিং আমার কাছে একেবারে উন্মাদনা। আমি ধরে নিলাম এটি একটি নির্দিষ্ট ধরণের মনের জন্য অর্থবোধ করে, তবে সেই ধরণের মনটি আমার ভঙ্গিতে ঘটে না। আমার ক্ষেত্রে রুবির জন্য $ DEITY ধন্যবাদ Thank
16/09

4
বোকা, এটি একটি ওয়ার্ট, সাধারণ পাইথন নেমস্পেসের সমস্যা নয়। মূল থ্রেড: Writonly.wordpress.com/2008/09/12/… এ সম্পর্কে অন্যান্য আলোচনার লিঙ্ক রয়েছে।
গ্রেগ লিন্ড

4
@ গ্রেগ লিঙ্কটি আর অ্যাক্সেসযোগ্য নয় (ত্রুটি 404)। সেই আলোচনায় কী ছিল?
ovgolovin

4
এই লিঙ্কগুলি সমস্ত মারা গেছে
এন্ডোলিথ

25

পাইথন 3 দিয়ে, আপনি ব্যবহার করতে পারেন globals=globals()

t = timeit.Timer("foo()", globals=globals())

ডকুমেন্টেশন থেকে :

আর একটি বিকল্প প্যারামিটারে পাস globals()করা globals, যা কোডটি আপনার বর্তমান বিশ্বব্যাপী নেমস্পেসের মধ্যে কার্যকর করা হবে। স্বতন্ত্রভাবে আমদানি নির্দিষ্ট করার চেয়ে এটি আরও সুবিধাজনক হতে পারে


4
পাইথন 3 এর জন্য কেবল কাজ করে। globalsপাইথন 2 এর জন্য কোনও প্যারামিটার নয়timeit
tony_tiger

21

আপনি এই হ্যাক চেষ্টা করতে পারেন:

import timeit

def foo():
    print 'bar'

def dotime():
    t = timeit.Timer("foo()")
    time = t.timeit(1)
    print "took %fs\n" % (time,)

import __builtin__
__builtin__.__dict__.update(locals())

dotime()

4
আপনার অন্যথায় জটিল সেটআপ কোড প্রয়োজন হলে এই হ্যাকটি দুর্দান্ত।
লুইস মার্কস

অন্যান্য জবাব দেওয়া (যেমন এর চেয়ে ভাল t = timeit.Timer("foo()", "from __main__ import foo")) দেওয়া স্টার্টআপ কোড বিকল্পের চেয়ে ভাল । বিশেষত যদি আপনি বেশ কয়েকটি বিভিন্ন ফাংশন পরীক্ষা করতে চান তবে এটি টাইপিংয়ের অনেকগুলি সঞ্চয় করবে!
এ.সোম্মারহ

4
আমি প্রায় 20 টি আমদানি পেয়েছি, সুতরাং যুক্তি হিসাবে এগুলি পাস করা অদৃশ্য হয়ে যায়। এই হ্যাক দুর্দান্ত!
kramer65

7
দুর্দান্ত! পাইথন 3 এ তবে আপনার প্রয়োজন import builtinsএবং 'বিল্টিনগুলি __। ডিক __। আপডেট (স্থানীয়রা ())'
গ্রিওল

আপনি কি সময় () ফাংশনে একাধিক ফাংশন সময় দিতে পারবেন?
edo101

8
t = timeit.Timer("foo()", "from __main__ import foo")

যেহেতু সময়সীমার আপনার জিনিসপত্রের সুযোগ নেই।


0

আপনার সেটআপে যোগ করুন "এই ফাইলটি আমদানি করুন!"

তারপরে আপনি যখন সেটআপ ফাংশনটি myfunc () কল করবেন তখন "thisfile.myfunc ()" ব্যবহার করুন

যেমন "thisfile.py"

def myfunc():

 return 5

def testable(par):

 pass



t=timeit.timeit(stmt="testable(v)",setup="import thisfile; v=thisfile.myfunc();").repeat(10)

print( t )
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.