2012-04-12 11 views
7

Tôi muốn đo tốc độ thực hiện các đoạn mã sau:Timeit, NameError: tên chung chưa được xác định. Nhưng tôi đã không sử dụng một biến toàn cầu

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

tôi lưu trữ mã này dưới pe1m.py. Bây giờ tôi muốn kiểm tra tốc độ của tập tin với trình thông dịch python. Tôi đã làm:

import timeit 
import pe1m 

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

nhưng tôi nhận được:

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 

Nhưng tôi không có bất kỳ biến toàn cầu.

+0

Khi bạn đang nhập khẩu các mô-đun, có một tuyên bố: pe1m nhập khẩu đó, IMHO, là một lỗi đánh máy cho một số mô-đun khác. – hjpotter92

+0

Có thể trùng lặp của [Bắt "tên chung" foo 'không được xác định "với thời gian của Python] (https://stackoverflow.com/questions/551797/getting-global-name-foo-is-not-defined-with-pythons -timeit) – sds

Trả lời

13

Hãy thử điều này:

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

timeit.Timer đối tượng không biết về không gian tên bạn đang gọi nó trong nên không thể truy cập vào pe1m mô-đun mà bạn nhập khẩu.

Đối số setup là một câu lệnh được thực hiện trong ngữ cảnh của câu lệnh định thời gian, chúng chia sẻ cùng một không gian tên để bất kỳ điều gì bạn xác định ở đó, sẽ có thể truy cập trong stmt.

+0

Có. Bạn cần một 'thiết lập' để nhập khẩu mô-đun vào không gian tên thời gian - cho dù bạn sử dụng' from' hoặc 'pe1m.' là một vấn đề hay tùy chọn. – agf

+1

Khi tôi thực hiện 't = timeit.Timer (stmt = 'pe1()', setup = 'từ pe1m import pe1')' thì 't.timeit()' nó chỉ tiếp tục in đầu ra của 'pe1m.pe1 () '(là 233168) vô hạn. – Bentley4

+0

@yak nếu bạn cập nhật giải pháp của mình (thêm dòng 't.timeit (number = 1)'), tôi có thể xóa câu trả lời của mình bên dưới. –

2

Bạn cũng có thể thử này

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