2012-08-15 106 views
2

我寫了下面的腳本Python「範圍」資源消耗

基本上,我只是學習Python的機器學習,並想檢查真正的計算密集型任務的執行情況。我觀察到,對於10 ** 8次迭代,Python佔用大量內存(大約3.8 GB),並且還有很多CPU時間(只是凍結了我的系統)

我想知道是否有任何方法可以限制時間/內存消耗或者通過代碼或一些全局設置

腳本 -

initial_start = time.clock() 
for i in range(9): 
start = time.clock() 
for j in range(10**i): 
    pass 
stop = time.clock() 
print 'Looping exp(',i,') times takes', stop - start, 'seconds' 
final_stop = time.clock() 
print 'Overall program time is',final_stop - initial_start,'seconds' 
+0

然後執行一些計算密集型的工作。迭代長列表會給你什麼見解嗎? – 2012-08-15 19:45:33

+0

你很驚訝,計算密集的東西使用大量的CPU? – 2012-08-15 20:47:16

+0

大家好。非常感謝你的幫助。這是我在Stackoverflow上的第一個問題。但我沒有得到我正在尋找的答案。我的問題是 - '我如何限制Python程序的時間/內存消耗?如果我最終運行了一些非常繁重的代碼(糟糕的編程/龐大的數據等),我不希望它讓我的系統失效' – Sammy25 2012-08-16 00:32:46

回答

2

看看這個問題:How to limit the heap size?

爲了解決你的腳本,timeit模塊的措施才能執行操作時更準確地

>>> import timeit 
>>> for i in range(9): 
...  print timeit.timeit(stmt='pass', number=10**i) 
... 
0.0 
0.0 
0.0 
0.0 
0.0 
0.015625 
0.0625 
0.468752861023 
2.98439407349 

你的例子正在其大部分時間處理你記憶中的巨大數字列表。 xrange而不是range將有助於解決該問題,但您仍在使用可怕的基準。該循環將反覆執行,而不是實際執行任何操作,因此cpu正忙於檢查條件並進入循環。

正如你所看到的,創建這些列表走的是大部分時間在這裏

>>> timeit.timeit(stmt='range(10**7)', number=1) 
0.71875405311584473 
>>> timeit.timeit(stmt='for i in range(10**7): pass', number=1) 
1.093757152557373 
5

在Python 2,range創建一個列表。改爲使用xrange。有關更詳細的解釋,請參閱Should you always favor xrange() over range()?

請注意,no-op for循環是非常糟糕的基準測試,它幾乎告訴您幾乎沒有任何有關Python的信息。

另請注意,根據gnibbler的評論,Python 3的range與Python 2的xrange一樣工作。

+1

請注意,Python3中的range()'像Python2中的xrange()一樣工作 – 2012-08-15 19:47:13

2

Python需要RAM,因爲你正在用range函數創建一個非常大的10 ** 8長度列表。這就是迭代器變得有用的地方。使用xrange代替range

它將以與range相同的方式工作,但不是在內存中創建大型列表,而是xrange將僅計算內部索引(每次迭代將其值增加1)。

+0

嗨Rostyslav。非常感謝你的幫助。這是我在Stackoverflow上的第一個問題。但我沒有得到我正在尋找的答案。我的問題是 - '我如何限制Python程序的時間/內存消耗?如果我最終運行一些非常繁重的代碼(糟糕的編程/龐大的數據等),我不想讓它降低我的系統' – Sammy25 2012-08-16 02:20:55

0

至於CPU,你有一個對數十億迭代運行循環沒有任何類型的睡眠或暫停其間,所以難怪這個過程完全佔用CPU(至少在一臺核心計算機上)。

1

如果您正在考慮Python進行機器學習,請查看numpy。它的理念是在優化的C中實現所有「內部循環」(矩陣運算,線性代數),並使用Python來操縱輸入和輸出以及管理高級算法 - 有點像使用Python的Matlab。這給你兩全其美:Python的易用性和可讀性,以及C的速度。

要回到你的問題,基準numpy操作會給你一個更現實的Python機器學習性能評估。