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.237026798073202372
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.237026798073202373 để 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.237026798073202375str▢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.237026798073202376int20Chiề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.237026798073202377boolTrueDisable để 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.237026798073202378float0. 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.196655919775366781; . 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.196655919775366782 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 loop0
Trường hợp các tùy chọn sau đây được hiểu
-n N, --số=Nbao nhiêu lần để thực hiện 'tuyên bố'
-r N, --lặp lại=Nbao nhiêu lần để lặp lại bộ đếm thời gian [mặc định 5]
-s S, --thiết lập=Scâ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ị=Uchỉ đị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òngin kết quả thời gian thô;
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 loop6
Ở đầ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 loop7
Đ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 loop8
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 loop9
>>> 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.237026798073202370
Để 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.237026798073202371
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ẻ