Tôi nghĩ câu trả lời ở đây tinh tế hơn một chút so với các câu trả lời khác đề xuất, mặc dù ý chính của nó là đúng: vòng lặp for nhanh hơn vì nhiều hoạt động xảy ra hơn trong C và ít hơn trong Python .
Cụ thể hơn, trong trường hợp vòng lặp for, hai điều xảy ra trong C mà trong vòng lặp while được xử lý bằng Python:
Trong vòng lặp while, phép so sánh i < 100000000
được thực hiện bằng Python, trong khi trong vòng lặp for, công việc được chuyển cho trình lặp của range(100000000)
, trình lặp thực hiện lặp lại nội bộ (và kiểm tra giới hạn sau đó) trong C.
Trong vòng lặp while, cập nhật vòng lặp i += 1
xảy ra bằng Python, trong khi trong vòng lặp for, trình lặp của range(100000000)
, được viết bằng C, thực hiện i+=1
(hoặc ++i
).
Chúng ta có thể thấy rằng sự kết hợp của cả hai điều này đã làm cho vòng lặp for nhanh hơn bằng cách thêm lại chúng theo cách thủ công để thấy sự khác biệt.
import timeit
N = 100000000
def while_loop():
i = 0
while i < N:
i += 1
def for_loop_pure():
for i in range(N):
pass
def for_loop_with_increment():
for i in range(N):
i += 1
def for_loop_with_test():
for i in range(N):
if i < N: pass
def for_loop_with_increment_and_test():
for i in range(N):
if i < N: pass
i += 1
def main():
print('while loop\t\t', timeit.timeit(while_loop, number=1))
print('for pure\t\t', timeit.timeit(for_loop_pure, number=1))
print('for inc\t\t\t', timeit.timeit(for_loop_with_increment, number=1))
print('for test\t\t', timeit.timeit(for_loop_with_test, number=1))
print('for inc+test\t', timeit.timeit(for_loop_with_increment_and_test, number=1))
if __name__ == '__main__':
main()
Tôi đã thử điều này với cả số 100000000 một hằng số theo nghĩa đen và với nó là một biến N
sẽ điển hình hơn.
while loop 3.5131139
for pure 1.3211338000000001
for inc 3.5477727000000003
for test 2.5209639
for inc+test 4.697028999999999
while loop 4.1298240999999996
for pure 1.3526357999999998
for inc 3.6060175
for test 3.1093069
for inc+test 5.4753364
Như bạn có thể thấy, trong cả hai trường hợp, while
thời gian rất gần với sự khác biệt của for inc+test
và for pure
. Cũng lưu ý rằng trong trường hợp chúng tôi sử dụng N
biến, biến while
có thêm một sự chậm lại để tra cứu liên tục giá trị của N
, nhưng for
không.
Thật là điên rồ khi những sửa đổi nhỏ như vậy có thể dẫn đến tốc độ mã gấp 3 lần , nhưng đó là Python dành cho bạn. Và thậm chí đừng giúp tôi bắt đầu khi bạn có thể sử dụng nội trang qua một vòng lặp nào đó ....