在Python中倡導使用for i in xrange(...)
風格的循環結構的基本原理是什麼?對於簡單的整數循環,開銷的差異是相當大的。我進行使用兩段代碼一個簡單的測試:Python首選語法背後的理由
文件idiomatic.py
:
#!/usr/bin/env python
M = 10000
N = 10000
if __name__ == "__main__":
x, y = 0, 0
for x in xrange(N):
for y in xrange(M):
pass
文件cstyle.py
:
#!/usr/bin/env python
M = 10000
N = 10000
if __name__ == "__main__":
x, y = 0, 0
while x < N:
while y < M:
y += 1
x += 1
剖析結果如下:
bash-3.1$ time python cstyle.py
real 0m0.109s
user 0m0.015s
sys 0m0.000s
bash-3.1$ time python idiomatic.py
real 0m4.492s
user 0m0.000s
sys 0m0.031s
我可以理解爲什麼Pythonic版本更慢 - 我想象它與調用xrange有很多關係,如果有一種方法可以倒回發生器,也許這可以被消除。但是,通過這種執行時間的差異,爲什麼會喜歡使用Pythonic版本?
編輯:我進行再次使用泰利先生提供的代碼測試,結果確實不如現在:
我想我會從這裏線程枚舉結論:
1)即使代碼包含在if __name__ == "__main__":
塊中,模塊範圍內的大量代碼也是一個壞主意,。
2)*奇怪的是,修改屬於thebadone
我的版本不正確的代碼(設爲y成長過程中沒有復位)產生的性能差別不大,甚至對於較大的M值和N
我認爲你的時機有缺陷。運行多個試驗,也許有一些實際執行的計算,以擺脫循環中的任何可能的優化 – Yuliy 2010-04-10 01:21:52
+1非常有趣的問題。在閱讀Martinelli的回答後,這個問題對我來說更加有趣,因爲它顯示了調用函數內外的代碼之間的細微差別。 – OscarRyz 2010-04-10 02:10:20
-1:由於該問題的基礎是從根本上不正確的代碼,請您關閉該問題。 – 2010-04-10 02:45:12