2012-04-24 44 views
8

tôi dường như không thể có được timeit.timeit để làm việc khi tôi có trường hợp ngoại lệ trong đối số tuyên bố thông qua như là chuỗi:Sử dụng dấu chấm phẩy bên timeit

# after the first and third semicolon, I put 4 spaces 
timeit.timeit('try:; a=1;except:; pass') 

Điều này dẫn đến:

Traceback (most recent call last): 
    File "a.py", line 48, in <module> 
    timeit.timeit('try:; a=1;except:; pass') 
    File "C:\CPython33\lib\timeit.py", line 230, in timeit 
    return Timer(stmt, setup, timer).timeit(number) 
    File "C:\CPython33\lib\timeit.py", line 136, in __init__ 
    code = compile(src, dummy_src_name, "exec") 
    File "<timeit-src>", line 6 
    try:; a=1;except:; pass 
     ^
SyntaxError: invalid syntax 

Tôi chạy nó với Python 3.3, nhưng cùng một lỗi xảy ra ngay cả với Python cũ (3.2).

UPDATE:

Tôi đã sau this documentation (tôi nhấn mạnh):

lớp timeit.Timer (stmt = 'pass', thiết lập = 'pass', hẹn giờ =)

Lớp cho tốc độ thực thi thời gian của các đoạn mã nhỏ.

Hàm khởi tạo có một câu lệnh được định thời gian, một câu lệnh bổ sung được sử dụng để thiết lập và chức năng hẹn giờ. Cả hai câu lệnh đều mặc định là 'vượt qua'; chức năng hẹn giờ phụ thuộc vào nền tảng (xem mô-đun tài liệu chuỗi). stmt và thiết lập cũng có thể chứa nhiều câu lệnh được phân cách bởi; hoặc dòng mới, miễn là chúng không chứa chuỗi nhiều dòng chữ.

Trả lời

19

Bạn cần cung cấp mã thụt lề phù hợp với dòng mới, chứ không phải dấu chấm phẩy. Hãy thử thay đổi nó như sau:

timeit.timeit('try:\n a=1\nexcept:\n pass') 

Mặc dù điều này có thể dễ đọc hơn như:

stmt = '''\ 
try: 
    a=1 
except: 
    pass''' 
timeit.timeit(stmt) 

phẩy sẽ làm việc tốt để tách tuyên bố rằng sẽ có mức thụt đầu dòng giống nhau, nhưng bất kỳ dấu cách hoặc tab bạn đặt giữa dấu chấm phẩy và câu lệnh tiếp theo sẽ bị bỏ qua để bạn không thể sử dụng chúng với thụt đầu dòng.

+0

Cảm ơn bạn .. bạn có thể kiểm tra câu hỏi được cập nhật không? Và trên thực tế 'timeit.timeit ('a = 1; b = 1')' hoạt động tốt ... – max

+0

@max - Dấu chấm phẩy sẽ hoạt động tốt để tách các câu lệnh có cùng mức thụt đầu dòng, nhưng bất kỳ dấu cách hoặc tab nào bạn đặt giữa dấu chấm phẩy và câu lệnh tiếp theo sẽ bị bỏ qua để bạn không thể sử dụng chúng với thụt đầu dòng. –

+0

@max, ';' sẽ không hoạt động để thử/trừ, đối với vòng lặp, trong khi vòng lặp, nếu khối, vv Nó chỉ hoạt động để tách các câu lệnh đơn giản. –

0

Đây là một chuỗi cũ nhưng có thể đáng để cập nhật. Một tùy chọn khác sử dụng textwrap để cải thiện khả năng đọc bằng cách cho phép mã mức thụt đầu cơ sở:

import timeit 
import textwrap 
print(timeit.timeit(textwrap.dedent(""" 
    try: 
    a=1 
    except: 
    pass 
    """), number=10)) 
Các vấn đề liên quan