Pertanyaan Mendapatkan "nama global 'foo' tidak didefinisikan" dengan timeit Python


Saya mencoba mencari tahu berapa banyak waktu yang diperlukan untuk mengeksekusi pernyataan Python, jadi saya melihat online dan menemukan bahwa pustaka standar menyediakan modul yang disebut timeit yang dimaksudkan untuk melakukan hal itu:

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()

Namun, ini menghasilkan kesalahan:

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

Saya masih baru mengenal Python dan saya tidak sepenuhnya memahami semua masalah pelingkupan yang dimilikinya, tetapi saya tidak tahu mengapa cuplikan ini tidak berfungsi. Ada pikiran apa?


76
2018-02-15 23:15


asal


Jawaban:


Ubah baris ini:

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

Untuk ini:

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

Periksa tautan yang Anda berikan di bagian paling bawah.

Untuk memberi modul waktu akses ke fungsi yang Anda tetapkan, Anda bisa mengirimkan parameter pengaturan yang berisi pernyataan impor:

Saya baru saja mengujinya di mesin saya dan itu berhasil dengan perubahan.


83
2018-02-15 23:18



Anda dapat mencoba peretasan ini:

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()

19
2018-03-22 11:16



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

Karena timeit tidak memiliki barang-barang Anda dalam lingkup.


8
2018-02-15 23:22



Kamu dapat memakai globals=globals() 

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

Dari dokumentasi:

Pilihan lain adalah lulus globals() ke globals parameter, yang mana   akan menyebabkan kode dieksekusi dalam global Anda saat ini   ruang nama. Ini bisa lebih mudah daripada menentukan secara individual   impor


7
2017-09-05 12:51



tambahkan ke dalam setup Anda "import thisfile;"

kemudian ketika Anda memanggil fungsi pengaturan myfunc () gunakan "thisfile.myfunc ()"

mis. "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 )

0
2018-06-01 22:45