Đối với python hẹn giờ vòng lặp

Trong bài viết này, chúng ta sẽ xem cách tạo đồng hồ đếm ngược bằng Python. Mã sẽ lấy thông tin đầu vào từ người dùng về thời lượng đếm ngược tính bằng giây. Sau đó, trên màn hình có định dạng 'phút' sẽ bắt đầu đếm ngược. giây'. Chúng tôi sẽ sử dụng mô-đun thời gian ở đây

Tiếp cận

Trong dự án này, chúng ta sẽ sử dụng time module và hàm sleep[] của nó. Làm theo các bước dưới đây để tạo đồng hồ đếm ngược

đồng hồ bấm giờ

Bộ đếm thời gian vòng lặp kiểu thanh tiến trình với thời gian hoàn thành dự kiến

Cài đặt

>>> import timeit
>>> timeit.timeit['"-".join[str[n] for n in range[100]]', number=10000]
0.3018611848820001
>>> timeit.timeit['"-".join[[str[n] for n in range[100]]]', number=10000]
0.2727368790656328
>>> timeit.timeit['"-".join[map[str, range[100]]]', number=10000]
0.23702679807320237
2

Cách sử dụng

Bọc trực tiếp bất kỳ lần lặp nào với

>>> import timeit
>>> timeit.timeit['"-".join[str[n] for n in range[100]]', number=10000]
0.3018611848820001
>>> timeit.timeit['"-".join[[str[n] for n in range[100]]]', number=10000]
0.2727368790656328
>>> timeit.timeit['"-".join[map[str, range[100]]]', number=10000]
0.23702679807320237
3 để nhận trạng thái tiến trình lặp

from looptimer import timedloop

for _ in timedloop[range[100], label='foo']:
	...

đầu ra mẫu

đối số tùy chọn

ArgumentTypeDefaultDescription_______24strNoneDescriptive label in ở bên trái của thanh tiến trình
>>> import timeit
>>> timeit.timeit['"-".join[str[n] for n in range[100]]', number=10000]
0.3018611848820001
>>> timeit.timeit['"-".join[[str[n] for n in range[100]]]', number=10000]
0.2727368790656328
>>> timeit.timeit['"-".join[map[str, range[100]]]', number=10000]
0.23702679807320237
5str▢Ký tự được sử dụng để điền vào thanh tiến trình
>>> import timeit
>>> timeit.timeit['"-".join[str[n] for n in range[100]]', number=10000]
0.3018611848820001
>>> timeit.timeit['"-".join[[str[n] for n in range[100]]]', number=10000]
0.2727368790656328
>>> timeit.timeit['"-".join[map[str, range[100]]]', number=10000]
0.23702679807320237
6int20Chiều rộng ký tự của thanh tiến trình
>>> import timeit
>>> timeit.timeit['"-".join[str[n] for n in range[100]]', number=10000]
0.3018611848820001
>>> timeit.timeit['"-".join[[str[n] for n in range[100]]]', number=10000]
0.2727368790656328
>>> timeit.timeit['"-".join[map[str, range[100]]]', number=10000]
0.23702679807320237
7boolTrueDisable để in mỗi bản cập nhật trên một dòng mới [hữu ích khi xen kẽ với các thông báo bản ghi khác]
>>> import timeit
>>> timeit.timeit['"-".join[str[n] for n in range[100]]', number=10000]
0.3018611848820001
>>> timeit.timeit['"-".join[[str[n] for n in range[100]]]', number=10000]
0.2727368790656328
>>> timeit.timeit['"-".join[map[str, range[100]]]', number=10000]
0.23702679807320237
8float0. 1Sử dụng để điều chỉnh tần suất in cho các vòng lặp nhanh

Mô-đun này cung cấp một cách đơn giản để định thời gian cho các đoạn mã Python nhỏ. Nó có cả một cũng như một. Nó tránh được một số bẫy phổ biến để đo thời gian thực hiện. Xem thêm phần giới thiệu của Tim Peters về chương "Thuật toán" trong ấn bản thứ hai của Python Cookbook, do O'Reilly xuất bản

Ví dụ cơ bản

Ví dụ sau đây cho thấy cách có thể sử dụng để so sánh ba biểu thức khác nhau

$ python3 -m timeit '"-".join[str[n] for n in range[100]]'
10000 loops, best of 5: 30.2 usec per loop
$ python3 -m timeit '"-".join[[str[n] for n in range[100]]]'
10000 loops, best of 5: 27.5 usec per loop
$ python3 -m timeit '"-".join[map[str, range[100]]]'
10000 loops, best of 5: 23.2 usec per loop

Điều này có thể đạt được từ với

>>> import timeit
>>> timeit.timeit['"-".join[str[n] for n in range[100]]', number=10000]
0.3018611848820001
>>> timeit.timeit['"-".join[[str[n] for n in range[100]]]', number=10000]
0.2727368790656328
>>> timeit.timeit['"-".join[map[str, range[100]]]', number=10000]
0.23702679807320237

Một callable cũng có thể được chuyển từ

>>> timeit.timeit[lambda: "-".join[map[str, range[100]]], number=10000]
0.19665591977536678

Tuy nhiên, xin lưu ý rằng điều đó sẽ tự động xác định số lần lặp lại chỉ khi sử dụng giao diện dòng lệnh. Trong phần này, bạn có thể tìm thấy các ví dụ nâng cao hơn

Giao diện Python

Mô-đun định nghĩa ba chức năng tiện lợi và một lớp công khai

thời gian. thời gian[stmt='pass' , setup='pass', timer=, number=1000000, globals=None]

Tạo một thể hiện với câu lệnh đã cho, mã thiết lập và chức năng hẹn giờ và chạy phương thức của nó với số lần thực thi. Đối số toàn cầu tùy chọn chỉ định một không gian tên để thực thi mã

Đã thay đổi trong phiên bản 3. 5. Tham số toàn cầu tùy chọn đã được thêm vào.

thời gian. lặp lại[stmt='pass' , setup='pass', timer=, repeat=5, number=1000000, globals=None]

Tạo một thể hiện với câu lệnh đã cho, mã thiết lập và chức năng hẹn giờ và chạy phương thức của nó với số lần thực thi và số lần lặp lại đã cho. Đối số toàn cầu tùy chọn chỉ định một không gian tên để thực thi mã

Đã thay đổi trong phiên bản 3. 5. Tham số toàn cầu tùy chọn đã được thêm vào.

Đã thay đổi trong phiên bản 3. 7. Giá trị lặp lại mặc định đã thay đổi từ 3 thành 5.

thời gian. default_timer[]

Bộ đếm thời gian mặc định, luôn luôn

Đã thay đổi trong phiên bản 3. 3. hiện là bộ hẹn giờ mặc định.

lớp thời gian. Hẹn giờ[stmt='pass' , setup='pass', timer=, globals=None]

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

Hàm tạo nhận một câu lệnh được tí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à

>>> timeit.timeit[lambda: "-".join[map[str, range[100]]], number=10000]
0.19665591977536678
1; . stmt và thiết lập cũng có thể chứa nhiều câu lệnh được phân tách bằng
>>> timeit.timeit[lambda: "-".join[map[str, range[100]]], number=10000]
0.19665591977536678
2 hoặc dòng mới, miễn là chúng không chứa ký tự chuỗi nhiều dòng. Theo mặc định, câu lệnh sẽ được thực thi trong không gian tên của timeit;

Để đo thời gian thực hiện của câu lệnh đầu tiên, hãy sử dụng phương thức. Các phương thức và là các phương thức tiện lợi để gọi nhiều lần

Thời gian thực hiện thiết lập được loại trừ khỏi tổng thời gian chạy thực thi

Các thông số thiết lập và stmt cũng có thể lấy các đối tượng có thể gọi được mà không cần đối số. Điều này sẽ nhúng các cuộc gọi đến chúng trong một chức năng hẹn giờ mà sau đó sẽ được thực hiện bởi. Lưu ý rằng chi phí thời gian lớn hơn một chút trong trường hợp này do các lệnh gọi hàm bổ sung

Đã thay đổi trong phiên bản 3. 5. Tham số toàn cầu tùy chọn đã được thêm vào.

thời gian[số=1000000]

Số thời gian thực hiện câu lệnh chính. Điều này thực thi câu lệnh thiết lập một lần, sau đó trả về thời gian cần thiết để thực thi câu lệnh chính một số lần, được tính bằng giây dưới dạng float. Đối số là số lần thông qua vòng lặp, mặc định là một triệu. Câu lệnh chính, câu lệnh thiết lập và chức năng hẹn giờ được sử dụng được truyền cho hàm tạo

Ghi chú

Theo mặc định, tạm thời tắt trong thời gian. Ưu điểm của phương pháp này là nó làm cho thời gian độc lập dễ so sánh hơn. Nhược điểm là GC có thể là một thành phần quan trọng trong hiệu suất của chức năng được đo. Nếu vậy, GC có thể được bật lại làm câu lệnh đầu tiên trong chuỗi thiết lập. Ví dụ

timeit.Timer['for i in range[10]: oct[i]', 'gc.enable[]'].timeit[]

phạm vi tự động[gọi lại=Không có]

Tự động xác định số lần gọi

Đây là một hàm tiện lợi gọi đi gọi lại nhiều lần sao cho tổng thời gian >= 0. 2 giây, trả về kết quả cuối cùng [số vòng lặp, thời gian thực hiện cho số vòng lặp đó]. Nó gọi theo các số tăng dần từ dãy 1, 2, 5, 10, 20, 50,… cho đến khi thời gian thực hiện ít nhất là 0. 2 giây

Nếu gọi lại được đưa ra và không phải là

timeit.Timer['for i in range[10]: oct[i]', 'gc.enable[]'].timeit[]
2, thì nó sẽ được gọi sau mỗi lần thử với hai đối số.
timeit.Timer['for i in range[10]: oct[i]', 'gc.enable[]'].timeit[]
3

Mới trong phiên bản 3. 6

lặp lại[lặp lại=5, number=1000000]

Gọi vài lần

Đây là một chức năng tiện lợi gọi lặp đi lặp lại, trả về một danh sách kết quả. Đối số đầu tiên chỉ định số lần gọi. Đối số thứ hai chỉ định đối số số cho

Ghi chú

Thật hấp dẫn khi tính toán giá trị trung bình và độ lệch chuẩn từ vectơ kết quả và báo cáo những giá trị này. Tuy nhiên, điều này không hữu ích lắm. Trong trường hợp điển hình, giá trị thấp nhất đưa ra giới hạn dưới cho tốc độ mà máy của bạn có thể chạy đoạn mã đã cho; . Vì vậy, kết quả có lẽ là con số duy nhất bạn nên quan tâm. Sau đó, bạn nên xem xét toàn bộ vectơ và áp dụng lẽ thường hơn là thống kê

Đã thay đổi trong phiên bản 3. 7. Giá trị lặp lại mặc định đã thay đổi từ 3 thành 5.

print_exc[tệp=Không có]

Trình trợ giúp để in truy nguyên từ mã hẹn giờ

sử dụng điển hình

t = Timer[...]       # outside the try/except
try:
    t.timeit[...]    # or t.repeat[...]
except Exception:
    t.print_exc[]

Ưu điểm so với truy nguyên tiêu chuẩn là các dòng nguồn trong mẫu đã biên dịch sẽ được hiển thị. Đối số tệp tùy chọn chỉ đạo nơi gửi truy nguyên;

Giao diện dòng lệnh

Khi được gọi là một chương trình từ dòng lệnh, mẫu sau được sử dụng

$ python3 -m timeit '"-".join[str[n] for n in range[100]]'
10000 loops, best of 5: 30.2 usec per loop
$ python3 -m timeit '"-".join[[str[n] for n in range[100]]]'
10000 loops, best of 5: 27.5 usec per loop
$ python3 -m timeit '"-".join[map[str, range[100]]]'
10000 loops, best of 5: 23.2 usec per loop
0

Trường hợp các tùy chọn sau đây được hiểu

-n N, --số=N

bao nhiêu lần để thực hiện 'tuyên bố'

-r N, --lặp lại=N

bao nhiêu lần để lặp lại bộ đếm thời gian [mặc định 5]

-s S, --thiết lập=S

câu lệnh sẽ được thực hiện một lần ban đầu [mặc định

t = Timer[...]       # outside the try/except
try:
    t.timeit[...]    # or t.repeat[...]
except Exception:
    t.print_exc[]
0]

-p, --quy trình

đo thời gian xử lý, không phải thời gian đồng hồ treo tường, sử dụng thay vì , đây là mặc định

Mới trong phiên bản 3. 3

-u, --đơn vị=U

chỉ định đơn vị thời gian cho đầu ra hẹn giờ;

Mới trong phiên bản 3. 5

-v, --dài dòng

in kết quả thời gian thô;

-h, --trợ giúp

in một thông báo sử dụng ngắn và thoát

Một câu lệnh nhiều dòng có thể được đưa ra bằng cách chỉ định mỗi dòng là một đối số câu lệnh riêng biệt; . Nhiều tùy chọn được đối xử tương tự

Nếu không được cung cấp, số vòng lặp phù hợp được tính bằng cách thử tăng các số từ chuỗi 1, 2, 5, 10, 20, 50, … cho đến khi tổng thời gian ít nhất là 0. 2 giây

các phép đo có thể bị ảnh hưởng bởi các chương trình khác đang chạy trên cùng một máy, vì vậy điều tốt nhất nên làm khi cần thời gian chính xác là lặp lại thời gian một vài lần và sử dụng thời gian tốt nhất. Tùy chọn này là tốt cho việc này; . Bạn có thể sử dụng để đo thời gian CPU

Ghi chú

Có một chi phí cơ bản nhất định liên quan đến việc thực hiện một câu lệnh vượt qua. Mã ở đây không cố gắng che giấu nó, nhưng bạn nên biết về nó. Chi phí cơ sở có thể được đo bằng cách gọi chương trình mà không cần đối số và nó có thể khác nhau giữa các phiên bản Python

ví dụ

Có thể cung cấp một câu lệnh thiết lập chỉ được thực hiện một lần khi bắt đầu

$ python3 -m timeit '"-".join[str[n] for n in range[100]]'
10000 loops, best of 5: 30.2 usec per loop
$ python3 -m timeit '"-".join[[str[n] for n in range[100]]]'
10000 loops, best of 5: 27.5 usec per loop
$ python3 -m timeit '"-".join[map[str, range[100]]]'
10000 loops, best of 5: 23.2 usec per loop
6

Ở đầu ra, có ba trường. Số vòng lặp, cho bạn biết số lần phần thân câu lệnh được chạy trên mỗi lần lặp lại vòng lặp định thời. Số lần lặp lại ['tốt nhất trong số 5'] cho bạn biết vòng lặp thời gian đã được lặp lại bao nhiêu lần và cuối cùng là thời gian mà phần thân câu lệnh mất trung bình trong lần lặp lại tốt nhất của vòng lặp thời gian. Tức là, thời gian lặp lại nhanh nhất chia cho số vòng lặp

$ python3 -m timeit '"-".join[str[n] for n in range[100]]'
10000 loops, best of 5: 30.2 usec per loop
$ python3 -m timeit '"-".join[[str[n] for n in range[100]]]'
10000 loops, best of 5: 27.5 usec per loop
$ python3 -m timeit '"-".join[map[str, range[100]]]'
10000 loops, best of 5: 23.2 usec per loop
7

Điều tương tự cũng có thể được thực hiện bằng cách sử dụng lớp và các phương thức của nó

$ python3 -m timeit '"-".join[str[n] for n in range[100]]'
10000 loops, best of 5: 30.2 usec per loop
$ python3 -m timeit '"-".join[[str[n] for n in range[100]]]'
10000 loops, best of 5: 27.5 usec per loop
$ python3 -m timeit '"-".join[map[str, range[100]]]'
10000 loops, best of 5: 23.2 usec per loop
8

Các ví dụ sau đây cho biết cách tính thời gian cho các biểu thức chứa nhiều dòng. Ở đây chúng tôi so sánh chi phí sử dụng so với. / để kiểm tra các thuộc tính đối tượng bị thiếu và hiện tại

$ python3 -m timeit '"-".join[str[n] for n in range[100]]'
10000 loops, best of 5: 30.2 usec per loop
$ python3 -m timeit '"-".join[[str[n] for n in range[100]]]'
10000 loops, best of 5: 27.5 usec per loop
$ python3 -m timeit '"-".join[map[str, range[100]]]'
10000 loops, best of 5: 23.2 usec per loop
9

>>> import timeit
>>> timeit.timeit['"-".join[str[n] for n in range[100]]', number=10000]
0.3018611848820001
>>> timeit.timeit['"-".join[[str[n] for n in range[100]]]', number=10000]
0.2727368790656328
>>> timeit.timeit['"-".join[map[str, range[100]]]', number=10000]
0.23702679807320237
0

Để cấp cho mô-đun quyền truy cập vào các chức năng bạn xác định, bạn có thể chuyển tham số thiết lập có chứa câu lệnh nhập

>>> import timeit
>>> timeit.timeit['"-".join[str[n] for n in range[100]]', number=10000]
0.3018611848820001
>>> timeit.timeit['"-".join[[str[n] for n in range[100]]]', number=10000]
0.2727368790656328
>>> timeit.timeit['"-".join[map[str, range[100]]]', number=10000]
0.23702679807320237
1

Một tùy chọn khác là chuyển đến tham số toàn cầu, điều này sẽ khiến mã được thực thi trong không gian tên chung hiện tại của bạn. Điều này có thể thuận tiện hơn so với việc chỉ định nhập khẩu riêng lẻ

Chủ Đề