我在python中有兩個類似的回圈。第一個回圈與第二個回圈完全相同,只是我試圖通過在一個變數中記住重復操作的結果來優化第二個回圈
。from timeit import default_timer as timer
loop1_time = 0
loop2_time = 0 回圈2_time = 0
for i in range(101)。
start = timer()
for loop_number in range(50)。
if loop_number % 3 ==0 and loop_number % 5 == 0:
a = 1 # print('FizzBuzz {}' .format(loop_number))
elif loop_number % 5 == 0:
# print('Buzz {} '.format(loop_number)).
b = 2.
elif loop_number % 3 == 0:
# print('Fizz {}' .format(loop_number)).
c = 3
end = timer()
loop1_time = loop1_time (end - start)
# print("第一個回圈花了" str(end - start))
start = timer()
for loop_number in range(50)。
answer_of_3 = loop_number % 3.
answer_of_5 = loop_number % 5.
if answer_of_3 == 0 and answer_of_5 == 0 。
# print('FizzBuzz {} '.format(loop_number)).
d = 1.
elif answer_of_3 == 0:
# print('Buzz {} '.format(loop_number)).
e = 2.
elif answer_of_5 == 0:
# print('Fizz {}' .format(loop_number)).
f = 3
end = timer()
loop2_time = loop2_time (end - start)
# print("Second loop took " str(end - start))
print("第一次回圈平均花了"/span> str(loop1_time / 101)
print("Second loop on average took " str(loop2_time /101)
最后的兩個列印結果一致顯示,第二個回圈比第一個回圈要慢一些。然而,通過保存幾個pf操作的結果以避免重復執行這些操作,我的印象是第二個回圈會更快。
對于為什么第二個回圈會比較慢,有什么想法嗎?
uj5u.com熱心網友回復:
當復制代碼并按原樣運行Python腳本時,我能夠復制你的結果。第一個版本稍微快一些。然而,把這些放在一個函式里并使用timeit,會得到不同的結果:
import timeit
from functools import partial
def f1(reps)。
for loop_number in range(reps)。
if loop_number % 3 == 0 and loop_number % 5 == 0:
a = 1 elif loop_number % 5 == 0:
elif loop_number % 3 == 0:
c = 3 def f2(reps)。
for loop_number in range(reps)。
answer_of_3 = loop_number % 3: answer_of_3 = loop_number % 3.
answer_of_5 = loop_number % 5if answer_of_3 == 0 and answer_of_5 == 0 。
a = 1
elif answer_of_5 == 0:
b = 2: b = 2.
elif answer_of_3 == 0:
c = 3: c = 3.
print(min(timeit.Timer(partial(f1, 1000)).repeater(5, 10000)
print(min(timeit.Timer(partial(f2, 1000)).repeat(5, 10000) )
# 1.0620667609982775)
# 0.9467761240011896[/span
現在,第二個回圈的速度稍快。即使你完全重復你的測驗,但把它放在一個函式中,第二個回圈仍然更快。
原因是CPython所特有的(而且在編譯語言和解釋語言之間也有所不同)。變數查找的速度有多快 "這個問題在區域和全域之間是不同的,因為在函式內部運行的代碼可以在其區域陣列中查找區域變數(尤其是屬性,這在這里并不相關),而全域查找則使用全域字典。
因此,對于在函式中運行的代碼,你關于快取更快的直覺通常是正確的,希望你的大部分代碼都是如此。但是性能和優化可能是極其難以事先預測的,尤其是像 Python 這樣的解釋型語言實作,其中,著名的,
x = x
x *=2
x <<= 1。
盡管是等價的,但都以不同的速度運行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/309421.html
標籤:
上一篇:斐波那契數列-如何計算斐波那契前100個偶數的總和?
下一篇:如何有效地更新多維陣列的多個副本
