我希望儘可能使用嵌套函數而不是Python中的方法或全局函數。所以我決定測試它們的性能,因爲它接合了當你在另一個函數中定義一個函數時,在外函數的每次調用中定義內函數都會有開銷。嵌套函數比Python中的全局函數更快嗎?
充其量我希望全局函數稍微快一點,但令人驚訝的是嵌套函數更快。有誰知道爲什麼?
這是我的代碼:
from time import clock
def a(n):
return n + 1
def b1(loopcount):
return sum([a(n) for n in range(loopcount)])
def b2(loopcount):
def a(n):
return n + 1
return sum([a(n) for n in range(loopcount)])
powers = [5, 6, 7]
b1times = []
b2times = []
print " ", "".join(["{:^10d}".format(n) for n in powers])
for i in range(5):
for power in powers:
t = clock()
b1(10**power)
b1times.append(clock() - t)
for power in powers:
t = clock()
b2(10**power)
b2times.append(clock() - t)
print "b1:", "".join(["{:^10.5f}".format(n) for n in b1times])
print "b2:", "".join(["{:^10.5f}".format(n) for n in b2times])
print ""
b1times = []
b2times = []
這是我的計算機上的結果:使用@Janne Karila的評論
現在我:
5 6 7
b1: 0.08200 0.82773 8.47946
b2: 0.06914 0.79637 8.18571
b1: 0.07332 0.82139 8.68262
b2: 0.06547 0.82088 8.19606
b1: 0.07963 0.82625 9.65037
b2: 0.06617 0.82027 8.21412
b1: 0.07630 0.82112 8.49082
b2: 0.06541 0.80686 8.20532
b1: 0.12328 0.87034 8.42964
b2: 0.07059 0.79717 8.24620
UPDATE多稱呼b1和b2,b1變得更快。正如@Kos和@Pavel Anossov在他們的回答中所說的那樣,一些因素會影響這裏的速度,所以你不能做出一般性陳述。
謝謝大家!
from time import *
def a1(n):
return n + 1
def b1(n):
return a1(n)
def b2(n):
def a2():
return n + 1
return a2()
powers = [4, 5, 6]
b1times = []
b2times = []
print " ", "".join(["{:^10d}".format(n) for n in powers])
for i in range(5):
for power in powers:
t = clock()
sum([b1(n) for n in range(10**power)])
b1times.append(clock() - t)
for power in powers:
t = clock()
sum([b2(n) for n in range(10**power)])
b2times.append(clock() - t)
print "b1:", "".join(["{:^10.5f}".format(n) for n in b1times])
print "b2:", "".join(["{:^10.5f}".format(n) for n in b2times])
print ""
b1times = []
b2times = []
比滾動自己計時的東西相反,你應該使用[了'timeit'模塊(http://docs.python.org/3.3/library/timeit.html)。 –
也,我認爲你應該調用你的內部函數的東西是不同於外部函數。稱他們都是「a」可能會在某個地方產生誤導。 –
您的每個時機都是對外部函數的單個調用,這會對內部函數進行多次調用。您沒有以這種方式計算外部函數的開銷。 –