2016-09-29 104 views
2

好的,所以這個問題的措辭很難說。爲什麼Python定義函數的執行速度比「def」範圍之外的全局腳本更快?

不過,我已經寫在Python 3.5.2兩個腳本:

import time 
t0 = time.clock() 
def hello(): 
    a = [] 
    for i in range(10000000): 
     a.append(i) 
hello() 
t1 = time.clock() 
print((t1-t0)) 

日期:1.0960211284655088

import time 
t0 = time.clock() 
a = [] 
for i in range(10000000): 
    a.append(i) 
t1 = time.clock() 
print((t1-t0)) 

日期:1.432725885821128

第一個腳本運行更快地在一個已定義的函數中,然後調用;然而,我不知道這是爲什麼,我想了解,所以我可以學習優化代碼。

這是一個關於Python 3這個特定方面的問題。我知道列表推導和map()是做這個特定迭代的很多,更快和更pythonic的方法。

+0

獨立於您對優化性能的追求,我覺得它總是*總是*更好地將代碼放在函數中,而不是放在文件範圍內。這使得將腳本轉換爲可重用模塊變得更加容易,並且讓代碼更易於理解繼承了您的內容的人員,然後再開始新的工作。 我個人認爲,即使是主腳本應該具有在文件範圍內無碼以外: 如果__name__ ==「__main__」: callToEntryFunction() 附:對不起,無法弄清楚如何在評論中格式化代碼。 : - \ – antred

+0

我完全同意。但是,用python進行快速入侵(就像以jupyter爲例)。如果在Python中查看大量數據,將其放入函數中可能會更快(性能明智)。當然,您可以始終使用R或Julia lol;但這是無關緊要的。 – dysfunctional

回答

0

在我看來。差異是由變量a的搜索引起的。 如果a是本地的,則該函數將快速找到並追加。 如果a是全局的,函數將首先在本地搜索一個,然後在全局搜索。這就是爲什麼花費更多時間。

+0

我有同樣的想法,並通過在全局上下文中放置'a = []'並在'hello()'的實現中添加'global a'來測試。沒有改變一件事。 –

+0

'我'也在當地的情況下,那呢? –

+0

在Python數據結構中,是否有一些內容是關於函數運行時使用不同的C代碼來支持它們,而不是在函數範圍之外運行腳本?也許在確定'a'是什麼開銷? – dysfunctional