如果我有一個函數Python:多次使用相同的參數調用相同的函數,或將結果保存爲中間值?
def bar(n):
return n**100
會不會有
for i in range(1000000):
x = bar(30)
# use x for something
和
x = bar(30)
# use x for something 1,000,000 times
之間的性能差異,如果翻譯已經像優化的情況下,我不知道這個?
如果我有一個函數Python:多次使用相同的參數調用相同的函數,或將結果保存爲中間值?
def bar(n):
return n**100
會不會有
for i in range(1000000):
x = bar(30)
# use x for something
和
x = bar(30)
# use x for something 1,000,000 times
之間的性能差異,如果翻譯已經像優化的情況下,我不知道這個?
CPython編譯器只做很少的簡單的peephole optimisations,但它肯定永遠不會優化掉一個函數調用 - 它如何知道函數是否有副作用?在編譯時,它通常不知道名稱bar
引用哪個函數,並且名稱綁定可能隨時發生更改。
如果有疑問,只需自己測量性能 - timeit
模塊是您的朋友。
取決於實施。 Pypy在版本1.5中增加了loop invariant code motion。
可能的重複[是否Python優化函數調用循環?](http://stackoverflow.com/questions/7243444/does-python-optimize-function-calls-from-loops) – delnan 2012-03-03 14:49:21
另請注意,在命令式編程語言,多次調用具有相同參數的函數可能會有完全不同的效果。證明某些這樣的調用可以省略,可能需要大量的程序間分析,並且內聯它們需要早期綁定(Python中不存在*)和優化編譯器或JIT編譯器。 – delnan 2012-03-03 14:51:39