我寫了一些非常簡單的測試(我知道,它們不是'結論性',但它們讓我好奇)。我跑了優化和所有的爵士樂。爲什麼Python的'all'函數太慢?
from time import time
alist = [ 2, 4, 6, 8, 10, 12, 24, 48, 64, 128 ]
def all_even(alist):
for val in alist:
if not (val & 1) == 0:
return False
return True
def all_even_bad(alist):
result = False
for val in alist:
if not (val & 1) == 0:
result = False
else:
result = True
return result
def main():
start = time()
for i in range(1, 10000):
all_even(alist)
print('All even: {0}'.format(time() - start))
start = time()
for i in range(1, 10000):
all_even_bad(alist)
print('All even bad: {0}'.format(time() - start))
start = time()
for i in range(1, 10000):
all(val & 1 == 0 for val in alist)
print('All one: {0}'.format(time() - start))
if __name__ == '__main__':
main()
我得到的結果周圍:
> All even: 2.86299991608
> All even bad: 3.71399998665
> All one: 3.89900016785
它出現在內置的功能不及早擺脫困境?
這裏肯定有什麼可疑的。你只能循環10000次10000個列表。你的時間不應該在幾秒鐘的時間。還要注意,你的all_even_bad函數是完全錯誤的; ^)(它實際上只是檢查最後一個元素)。 – mgilson 2012-07-20 17:21:00
對不起 - 我有一堆測試,但沒有想到發佈所有的代碼。我試圖發佈一個小但可運行的示例。 :) – 2012-07-20 17:22:59