Timeit, NameError: global name is not defined. But I didn't use a global variable
Asked Answered
Y

2

11

I'd like to measure the execution speed of the following code:

def pe1():
    l = []
    for i in range(1000):
        if i%3 == 0 or i%5 == 0:
            l.append(i)
    print sum(l)

I stored this code under pe1m.py . Now I'd like to test the speed of file with the python interpreter. I did:

import timeit
import pe1m

t = timeit.Timer(stmt = 'pe1m.pe1()')
t.timeit()

but I get:

File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/timeit.py", line 195, in timeit
    timing = self.inner(it, self.timer)
  File "<timeit-src>", line 6, in inner
NameError: global name 'pe1m' is not defined

But I don't have any global variables.

Yalonda answered 12/4, 2012 at 22:12 Comment(2)
When you are importing the modules, there's a statement: import pe1m which, imho, is a typo for some other module.Biles
Possible duplicate of Getting "global name 'foo' is not defined" with Python's timeitRedness
R
17

Try this:

t = timeit.Timer(stmt='pe1()', setup='from pe1m import pe1')

timeit.Timer object doesn't know about the namespace you're calling it in so it can't access the pe1m module that you imported.

The setup argument is a statement executed in the context of the timed statement, they share the same namespace so whatever you define there, will be accessible in stmt.

Raynard answered 12/4, 2012 at 22:22 Comment(3)
Yes. You need a setup to import the module into the time namespace -- whether you use from or pe1m. is a matter or preference.Counterfoil
When I do t = timeit.Timer(stmt='pe1()', setup='from pe1m import pe1') then t.timeit() it just keeps on printing the output of pe1m.pe1()(which is 233168) infinitely.Yalonda
@Raynard if you update your solution (add the t.timeit(number=1) line), I can delete my answer below.Sopping
B
7

You can also try this

>>>def pe1():
>>>    l = []
>>>    for i in range(1000):
>>>        if i%3 == 0 or i%5 == 0:
>>>            l.append(i)
>>>    print(sum(l))
>>>
>>>from  timeit import time it
>>>timeit('pe1()',setup="from __main__ import pe1",number=100) # Run 100 times
>>>timeit('pe1()',setup="from __main__ import pe1")  # run default times of 1000000 
Bismuthic answered 17/2, 2015 at 8:11 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.